(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

时间:2022-09-05 22:39:11

原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开
这里解释上一节中获取名称的方法 GetDisplayNameOf 定义:

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单void GetDisplayNameOf( (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            IntPtr pidl, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            SHGNO uFlags, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            IntPtr lpName);

该方法是用来转换PIDL成为可显示的名称字符串。PIDL必须是相对于对象的父目录的。换句话说,它必须包含一个非空的SHITEMID 结构。因为有多种命名对象的方式,资源管理器通过在uFlags参数中定义SHGNO标识的组合来表示名称类型。SHGDN_NORMAL或 SHGDN_INFOLDER将被用来指定名称是相对于文件夹的还是相对于桌面的。其他三个值SHGDN_FOREDITING、 SHGDN_FORADDRESSBAR和SHGDN_FORPARSING可以用来指定名称的用途。 名称必须按STRRET的结构形式返回,如果SHGDN_FOREDITING、SHGDN_FORADDRESSBAR和 SHGDN_FORPARSING没有设定,就返回外壳对象的显示名称。
具体实现方法:

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            StringBuilder buf = new StringBuilder(MAX_PATH); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            Root.GetDisplayNameOf(pidlSub, SHGNO.INFOLDER, strr); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            API.StrRetToBuf(strr, pidlSub, buf, MAX_PATH); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            Marshal.FreeCoTaskMem(strr); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            return buf.ToString(); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        }
(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单public enum SHGNO (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    { (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        NORMAL = 0x0, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        INFOLDER = 0x1, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FOREDITING = 0x1000, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FORADDRESSBAR = 0x4000, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FORPARSING = 0x8000, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    }

事实上,只要修改 SHGNO ,就可以获取其绝对路径:

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            desktop.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, path, out i, out Pidl, ref j); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            desktop.BindToObject(Pidl, IntPtr.Zero, ref Guids.IID_IShellFolder, out IFolder); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            return IFolder; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        }

但我们还关心类似“桌面”、“我的文档”这种既是普通文件夹又是特殊对象的绝对路径如何获得,这里就要用到 SHGetSpecialFolderPath API 了。

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单[DllImport("Shell32.Dll")] (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        private static extern bool SHGetSpecialFolderPath( (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            IntPtr hwndOwner,  (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            StringBuilder lpszPath, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            ShellSpecialFolders nFolder, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            bool fCreate); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单public enum ShellSpecialFolders (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    { (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        DESKTOP = 0x0000,         // <desktop> (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        INTERNET = 0x0001, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PROGRAMS = 0x0002,        // Start Menu/Programs (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        CONTROLS = 0x0003,        // My Computer/Control Panel (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PRINTERS = 0x0004,        // My Computer/Printers (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PERSONAL = 0x0005,        // My Documents (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FAVORITES = 0x0006,        // <user name>/Favorites (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        STARTUP = 0x0007,        // Start Menu/Programs/Startup (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        RECENT = 0x0008,        // <user name>/Recent (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        SENDTO = 0x0009,        // <user name>/SendTo (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        BITBUCKET = 0x000a,        // <desktop>/Recycle Bin (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        STARTMENU = 0x000b,        // <user name>/Start Menu (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        MYDOCUMENTS = 0x000c,        // logical "My Documents" desktop icon (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        MYMUSIC = 0x000d,        // "My Music" folder (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        MYVIDEO = 0x000e,        // "My Videos" folder (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        DESKTOPDIRECTORY = 0x0010,        // <user name>/Desktop (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        DRIVES = 0x0011,        // My Computer (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        NETWORK = 0x0012,        // Network Neighborhood (My Network Places) (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        NETHOOD = 0x0013,        // <user name>/nethood (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FONTS = 0x0014,        // windows/fonts (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        TEMPLATES = 0x0015, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_STARTMENU = 0x0016,        // All Users/Start Menu (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_PROGRAMS = 0X0017,        // All Users/Start Menu/Programs (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_STARTUP = 0x0018,        // All Users/Startup (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_DESKTOPDIRECTORY = 0x0019,        // All Users/Desktop (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        APPDATA = 0x001a,        // <user name>/Application Data (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PRINTHOOD = 0x001b,        // <user name>/PrintHood (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        LOCAL_APPDATA = 0x001c,        // <user name>/Local Settings/Applicaiton Data (non roaming) (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        ALTSTARTUP = 0x001d,        // non localized startup (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_ALTSTARTUP = 0x001e,        // non localized common startup (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_FAVORITES = 0x001f, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        INTERNET_CACHE = 0x0020, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COOKIES = 0x0021, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        HISTORY = 0x0022, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_APPDATA = 0x0023,        // All Users/Application Data (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        WINDOWS = 0x0024,        // GetWindowsDirectory() (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        SYSTEM = 0x0025,        // GetSystemDirectory() (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PROGRAM_FILES = 0x0026,        // C:/Program Files (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        MYPICTURES = 0x0027,        // C:/Program Files/My Pictures (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PROFILE = 0x0028,        // USERPROFILE (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        SYSTEMX86 = 0x0029,        // x86 system directory on RISC (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PROGRAM_FILESX86 = 0x002a,        // x86 C:/Program Files on RISC (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PROGRAM_FILES_COMMON = 0x002b,        // C:/Program Files/Common (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        PROGRAM_FILES_COMMONX86 = 0x002c,        // x86 Program Files/Common on RISC (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_TEMPLATES = 0x002d,        // All Users/Templates (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_DOCUMENTS = 0x002e,        // All Users/Documents (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_ADMINTOOLS = 0x002f,        // All Users/Start Menu/Programs/Administrative Tools (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        ADMINTOOLS = 0x0030,        // <user name>/Start Menu/Programs/Administrative Tools (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        CONNECTIONS = 0x0031,        // Network and Dial-up Connections (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_MUSIC = 0x0035,        // All Users/My Music (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_PICTURES = 0x0036,        // All Users/My Pictures (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_VIDEO = 0x0037,        // All Users/My Video (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        RESOURCES = 0x0038,        // Resource Direcotry (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        RESOURCES_LOCALIZED = 0x0039,        // Localized Resource Direcotry (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMMON_OLINKS = 0x003a,        // Links to All Users OEM specific apps (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        CDBURN_AREA = 0x003b,        // USERPROFILE/Local Settings/Application Data/Microsoft/CD Burning (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        COMPUTERSNEARME = 0x003d,        // Computers Near Me (computered from Workgroup membership) (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FLAG_CREATE = 0x8000,        // combine with  value to force folder creation in SHGetFolderPath() (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FLAG_DONT_VERIFY = 0x4000,        // combine with  value to return an unverified folder path (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FLAG_NO_ALIAS = 0x1000,        // combine with  value to insure non-alias versions of the pidl (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FLAG_PER_USER_INIT = 0x0800,        // combine with  value to indicate per-user init (eg. upgrade) (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        FLAG_MASK = 0xFF00,        // mask for all possible flag values (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    }
(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单/// <summary> (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        /// 获取特殊文件夹的路径 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        /// </summary> (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        public static string GetSpecialFolderPath(IntPtr hwnd, ShellSpecialFolders nFolder) (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        { (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            StringBuilder sb = new StringBuilder(MAX_PATH); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            SHGetSpecialFolderPath(hwnd, sb, nFolder, false); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            return sb.ToString(); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        }

上下文菜单
对象的上下文菜单相关的接口是 IContextMenu,通过对象的父文件夹的IShellFolder.GetUIObjectOf方法可得到该接口。得到该接口后,可以用 IContextMenu.QueryContextMenu方法来生成上下文菜单的菜单项,用IContextMenu.InvokeCommand调 用相应的命令。
好,让我们一步一步来实现 IShellFolder 对象的上下文菜单弹出。
首先假设我们已经获得某个 IShellFolder 对象的 PIDL 和其上级 IShellFolder 对象:

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单IntPtr PIDL; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单IShellFolder IParent;

然后我们定义一个存放 PIDL 的数组:

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单] = PIDL;

没错,我们的确要用到 PIDL 数组。可以理解,你在资源管理器中选择了多个文件/文件夹,再点击右键,弹出的上下文菜单将有所不同。你可以根据需要,把同一级的多个 PIDL 放到数组里面,实现这个效果。由于我们在例2的树中弹出菜单,所以只存放一个节点的 PIDL。
IContextMenu 是一个接口,我们这样定义:

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单using System; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单using System.Collections.Generic; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单using System.Text; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单using System.Runtime.InteropServices; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单namespace WinShell (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单{ (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    [ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), GuidAttribute("000214e4-0000-0000-c000-000000000046")] (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    public interface IContextMenu (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    { (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        [PreserveSig()] (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        Int32 QueryContextMenu( (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            IntPtr hmenu, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            uint iMenu, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            uint idCmdFirst, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            uint idCmdLast, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            CMF uFlags); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        [PreserveSig()] (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        Int32 InvokeCommand( (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            ref CMINVOKECOMMANDINFOEX info); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        [PreserveSig()] (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单        void GetCommandString( (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            int idcmd, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            GetCommandStringInformations uflags, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            int reserved, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            StringBuilder commandstring, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            int cch); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    } (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单} (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

然后,通过 IParent 的 GetUIObjectOf 方法我们可以得到该节点的一个或多个指定子节点的 IContextMenu 接口:

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单IntPtr GetUIObjectOf( (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            IntPtr hwndOwner, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            uint cidl, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            [MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            [In()] ref Guid riid, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单            out IntPtr rgfReserved);
(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单//得到 IContextMenu 接口 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单                    IntPtr iContextMenuPtr = IntPtr.Zero; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单                    iContextMenuPtr = IParent.GetUIObjectOf(IntPtr.Zero, (uint)pidls.Length,  (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单                        pidls, ref Guids.IID_IContextMenu, out iContextMenuPtr); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单                    IContextMenu iContextMenu = (IContextMenu)Marshal.GetObjectForIUnknown(iContextMenuPtr);

得到 IContextMenu 后我们需要提供一个弹出式菜单的句柄,并把他传给 IContextMenu.QueryContextMenu,如果该方法执行成功的话,会在我们的菜单里加入相应的菜单项。

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单, (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单API.CMD_FIRST, API.CMD_LAST, CMF.NORMAL | CMF.EXPLORE);

有了菜单项,我们就可以弹出该菜单了,我们用 TPM_RETURNCMD 标志指定 TrackPopupMenu 必须返回用户所选菜单项的 ID,以便稍后通过IContextMenu.InvokeCommand 来执行菜单命令:

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单; (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单    iContextMenu.InvokeCommand(ref invoke); (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单}

惯例附上图片和源代码:
(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
源代码:/Files/lemony/WinShell3.rar
下一节深入讲述 iContextMenu,让我们可以插入自己的菜单,或者直接调用菜单命令。

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单的更多相关文章

  1. &lpar;C&num;&rpar;Windows Shell 编程系列4 - 上下文菜单&lpar;iContextMenu&rpar;(二)嵌入菜单和执行命令

    原文(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:( ...

  2. C&num;&rpar;Windows Shell 编程系列5 - 获取图标

    原文 C#)Windows Shell 编程系列5 - 获取图标 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 编程系列4 - 上下 ...

  3. &lpar;C&num;&rpar;Windows Shell 编程系列2 - 解释,从&OpenCurlyDoubleQuote;桌面”开始展开

    原文 (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一篇:(C#)Windows Shell 编 ...

  4. &lpar;C&num;&rpar;Windows Shell 编程系列1 - 基础,浏览一个文件夹

    原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ...

  5. &lpar;C&num;&rpar;Windows Shell 外壳编程系列4 - 上下文菜单&lpar;iContextMenu&rpar;(二)嵌入菜单和执行命令

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 上一节说到如 ...

  6. &lbrack;转&rsqb;Windows Shell 编程 第二章 【来源:http&colon;&sol;&sol;blog&period;csdn&period;net&sol;wangqiulin123456&sol;article&sol;details&sol;7987893】

    第二章Shell的结构  “Shell 编程”的大伞之下有大量的API函数和COM接口.这个种类繁多的‘命令’集允许你用不同的方法对Windows Shell进行编程.函数和接口并不是两种提供相同功能 ...

  7. shell编程系列25--shell操作数据库实战之备份MySQL数据,并通过FTP将其传输到远端主机

    shell编程系列25--shell操作数据库实战之备份MySQL数据,并通过FTP将其传输到远端主机 备份mysql中的库或者表 mysqldump 常用参数详解: -u 用户名 -p 密码 -h ...

  8. shell编程系列10--文本处理三剑客之sed利用sed查询特定内容

    shell编程系列10--文本处理三剑客之sed利用sed查询特定内容 利用sed查找文件内容: pattern种类: .8p .,10p .,+5p ./regexp/p .,/regexp/p . ...

  9. Windows Shell Extension 系列文章

    Windows Shell Extension 系列文章 http://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-C ...

随机推荐

  1. 用css改变默认的checkbox样式

    自己常用的改变checkbox样式的两个方法: 一.利用background用图片代替checkbox效果 缺点:你首先得有一张好看的图片 优点:浏览器兼容性好 <!doctype html&g ...

  2. STM32F4&lowbar;TIM基本延时(计数原理)

    Ⅰ.概述 STM32的TIM定时器分为三类:基本定时器.通用定时器和高级定时器.从分类来看就知道STM32的定时器功能是非常强大的,但是,功能强大了,软件配置定时器就相对复杂多了.很多初学者甚至工作了 ...

  3. MAX函数和GROUP BY 语句一起使用的一个误区

    使用MAX 函数和 GROUP 的时候会有不可预料的数据被SELECT 出来.下面举个简单的例子:想知道每个SCOREID 的 数学成绩最高的分数. 表信息:/*DDL Information For ...

  4. 每日一算法【one】

    //有一个数组  {1,2,3,4,5,6,7,8,9,12,13,45,67,89,99,101,111,123,134,565,677} 查找数组中是否有指定的某一个数. /** *------- ...

  5. hdu&lowbar;5676&lowbar;ztr loves lucky numbers

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 在这%一下安神,用了我没见过的黑科技next_permutation,至少我是今天才知道的 #i ...

  6. 【框架学习与探究之依赖注入--Autofac】

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7603642.html 序 同样的又是一个双11如期而至,淘宝/天猫实时数据显示,开场3分钟总交易额突破 ...

  7. 邓&lowbar; Php&&num;183&semi;笔记本&lbrack;照片&rsqb;

    -------------------------------------------------------------------------------------------- [PHP] - ...

  8. linux oops调试

    参考文章: arm 指令定位错误 https://blog.csdn.net/songcdut/article/details/41383483 linux mips指令学习 https://www. ...

  9. Python爬虫入门教程 24-100 微医挂号网医生数据抓取

    1. 写在前面 今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做 ...

  10. UE4中使用URL图片

    转自:http://www.52vr.com/article-911-1.html