首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从C#应用程序中显示Windows资源管理器上下文菜单?

要在C#应用程序中显示Windows资源管理器上下文菜单,您可以使用Windows API(Win32 API)中的IContextMenu接口。以下是一个简单的示例,说明如何实现此功能:

  1. 首先,您需要在C#项目中添加对Windows API的引用。为此,请在项目中添加以下代码:
代码语言:csharp
复制
using System.Runtime.InteropServices;

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214e4-0000-0000-c000-000000000046")]
internal interface IContextMenu
{
    [PreserveSig]
    int QueryContextMenu(IntPtr hMenu, uint indexMenu, int idCmdFirst, int idCmdLast, uint uFlags);

    [PreserveSig]
    int InvokeCommand(ref CMINVOKECOMMANDINFOEX info);

    [PreserveSig]
    int GetCommandString(int idCmd, uint uType, IntPtr pReserved, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMax);
}

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214f4-0000-0000-c000-000000000046")]
internal interface IShellFolder
{
    void ParseDisplayName(IntPtr hwnd, IntPtr pbc, [MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName, ref int pchEaten, out IntPtr ppidl, ref int pdwAttributes);

    void EnumObjects(IntPtr hwnd, uint grfFlags, out IEnumIDList ppenumIDList);

    void BindToObject(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, out IntPtr ppv);

    void BindToStorage(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, out IntPtr ppv);

    void CompareIDs(IntPtr lParam, IntPtr pidl1, IntPtr pidl2);

    void CreateViewObject(IntPtr hwndOwner, [In] ref Guid riid, out IntPtr ppv);

    void GetAttributesOf(uint cidl, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, ref uint rgfInOut);

    void GetUIObjectOf(IntPtr hwndOwner, uint cidl, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, [In] ref Guid riid, IntPtr rgfReserved, out IntPtr ppv);

    void GetDisplayNameOf(IntPtr pidl, uint uFlags, out IntPtr pName);

    void SetNameOf(IntPtr hwnd, IntPtr pidl, [MarshalAs(UnmanagedType.LPWStr)] string pszName, uint uFlags, out IntPtr ppidlOut);
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
internal struct CMINVOKECOMMANDINFOEX
{
    public int cbSize;
    public int fMask;
    public IntPtr hwnd;
    public IntPtr lpVerb;
    public string lpParameters;
    public string lpDirectory;
    public int nShow;
    public int dwHotKey;
    public IntPtr hIcon;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string lpTitle;
    public IntPtr lpVerbW;
    public string lpParametersW;
    public string lpDirectoryW;
    public string lpTitleW;
    public int ptInvoke;
}

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214F2-0000-0000-C000-000000000046")]
internal interface IEnumIDList
{
    [PreserveSig]
    int Next(uint celt, IntPtr rgelt, out uint pceltFetched);

    [PreserveSig]
    int Skip(uint celt);

    [PreserveSig]
    int Reset();

    [PreserveSig]
    int Clone(out IEnumIDList ppenum);
}
  1. 接下来,您可以使用以下代码来显示上下文菜单:
代码语言:csharp
复制

private static class NativeMethods

{

代码语言:txt
复制
public const int CMF_NORMAL = 0x00000000;
代码语言:txt
复制
public const int CMF_DEFAULTONLY = 0x00000001;
代码语言:txt
复制
public const int CMF_VERBSONLY = 0x00000002;
代码语言:txt
复制
public const int CMF_EXPLORE = 0x00000004;
代码语言:txt
复制
public const int CMF_NOVERBS = 0x00000008;
代码语言:txt
复制
public const int CMF_CANRENAME = 0x00000010;
代码语言:txt
复制
public const int CMF_NODEFAULT = 0x00000020;
代码语言:txt
复制
public const int CMF_INCLUDESTATIC = 0x00000040;
代码语言:txt
复制
public const int CMF_EXTENDEDVERBS = 0x00000100;
代码语言:txt
复制
public const int CMF_RESERVED = 0xffff0000;
代码语言:txt
复制
public const int CMD_FIRST = 1;
代码语言:txt
复制
public const int CMD_LAST = 30000;
代码语言:txt
复制
public const int MFS_DISABLED = 0x00000003;
代码语言:txt
复制
public const int MFS_ENABLED = 0x00000000;
代码语言:txt
复制
public const int MFS_UNCHECKED = 0x00000001;
代码语言:txt
复制
public const int MFS_UNHILITE = 0x00000000;
代码语言:txt
复制
public const int MFS_CHECKED = 0x00000008;
代码语言:txt
复制
public const int MFS_HILITE = 0x00000080;
代码语言:txt
复制
public const int MFS_DEFAULT = 0x00001000;
代码语言:txt
复制
public const int S_OK = 0;
代码语言:txt
复制
public const int S_FALSE = 1;
代码语言:txt
复制
public const
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Eclipse使用入门教程[通俗易懂]

    Eclipse使用入门教程 说起java的IDE,朗朗上口的无非是Eclipse了,假若能熟练Eclipse,对于我们编写java程序会起到事半功倍的效果,大大提高我们工作效率。因此本篇博文,笔者只是针对刚刚入门java的新手,以便他们能尽快掌握Eclipse的使用。 1. 常用快捷键 这是使用工具的第一步,熟练使用快捷键对于我们编写程序会起到相当大帮助,所以这里笔者列出的快捷键建议大家必须都掌握。 Ctrl + 鼠标左键(类、方法、属性的变量名词):定位跟踪某变量声明或定义的位置 Ctrl + S:保存当前文件 Ctrl + X:剪切 Ctrl + C:复制 Ctrl + V:粘贴 Ctrl + D:删除当前行 Ctrl + F:查找/替换(当前编辑窗口) Ctrl + H:全局搜索 Ctrl + /:注释当前行或多行代码 Ctrl + Shift + C:注释当前行或多行代码 Ctrl + Shift + F:格式化当前代码 Ctrl + Shift + O:缺少的Import语句被加入,多余的Import语句被删除(先把光标定位到需导入包的类名上) Ctrl + Shift + S:保存所有文件 Ctrl + Shift + X:把当前选中的文本全部变为大写 Ctrl + Shift + Y:把当前选中的文本全部变为小写 Alt + /:代码智能提示 Alt + Shift + R:重命名(包括文件名、类名、方法名、变量名等等,非常好用) Alt + Shift + J:生成类或方法的注释 Alt + Shift + S:打开Source窗口(生成get、set方法,实现、覆盖接口或类的方法,很常用) Alt + Shift + D, J:如果有main方法入口,则以Debug方式执行代码 Alt + Shift + X, J:如果有main方法入口,则以Run方式执行代码

    02

    CorelDRAW2022简体中文完整版本 新增功能介绍

    CorelDRAW是我最早接触的矢量绘图软件,一直用它绘图、排版、打印、输出,一直感觉它功能很强大,CorelDRAW是加拿大的corel公司出品的,corel公司的产品强调的是编辑功能,它将各种要实现的功能直接表现于具体操作中,动动鼠标基本就能实现你想要的效果。CorelDRAW侧重于技术绘图,你可以看到你身边有些小公司没有装CAD软件,就拿CDR软件去绘制一些简单的室内布置图和示意图(这点从corel公司出品的corelcad也可以看出corel公司的优势在此),CorelDRAW的优势在于一个广度,CorelDRAW每次更新都是增加一个小功能,功能多,矢量绘图、文字排版、照片处理、甚至网页编辑,它都可以。CDR更像个无所不能的多面手,绘图、排版、编辑、输出无所不能,就像个能拉客又能拉货的五菱神车或昌河北斗星,有了它你什么都能干。

    02
    领券