/// <summary> /// Carry out the command associated with a shortcut menu item. /// </summary> /// <param name="pici"> /// A pointer to a CMINVOKECOMMANDINFO or CMINVOKECOMMANDINFOEX structure /// containing information about the command. /// </param> public void InvokeCommand(IntPtr pici) { var ici = (CMINVOKECOMMANDINFO)Marshal.PtrToStructure(pici, typeof(CMINVOKECOMMANDINFO)); LEMenuItem item = menuItems[NativeMethods.LowWord(ici.verb.ToInt32())]; OnVerbDisplayFileName(item.Commands); }
/// <summary> /// Add commands to a shortcut menu. /// </summary> /// <param name="hMenu">A handle to the shortcut menu.</param> /// <param name="iMenu"> /// The zero-based position at which to insert the first new menu item. /// </param> /// <param name="idCmdFirst"> /// The minimum value that the handler can specify for a menu item ID. /// </param> /// <param name="idCmdLast"> /// The maximum value that the handler can specify for a menu item ID. /// </param> /// <param name="uFlags"> /// Optional flags that specify how the shortcut menu can be changed. /// </param> /// <returns> /// If successful, returns an HRESULT value that has its severity value set /// to SEVERITY_SUCCESS and its code value set to the offset of the largest /// command identifier that was assigned, plus one. /// </returns> public int QueryContextMenu( IntPtr hMenu, uint iMenu, uint idCmdFirst, uint idCmdLast, uint uFlags) { // If uFlags include CMF_DEFAULTONLY then we should not do anything. if (((uint)CMF.CMF_DEFAULTONLY & uFlags) != 0) { return(WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, 0)); } // Add a separator. var sep = new MENUITEMINFO(); sep.cbSize = (uint)Marshal.SizeOf(sep); sep.fMask = MIIM.MIIM_TYPE; sep.fType = MFT.MFT_SEPARATOR; if (!NativeMethods.InsertMenuItem(hMenu, 0, true, ref sep)) { return(Marshal.GetHRForLastWin32Error()); } // Register item 0: Submenu IntPtr hSubMenu = NativeMethods.CreatePopupMenu(); LEMenuItem item = menuItems[0]; RegisterMenuItem(0, idCmdFirst, item.Text, item.Bitmap, hSubMenu, 1, hMenu); // Register item 1: RunDefault item = menuItems[1]; RegisterMenuItem(1, idCmdFirst, item.Text, item.Bitmap, IntPtr.Zero, 0, hSubMenu); // Add a separator. sep = new MENUITEMINFO(); sep.cbSize = (uint)Marshal.SizeOf(sep); sep.fMask = MIIM.MIIM_TYPE; sep.fType = MFT.MFT_SEPARATOR; NativeMethods.InsertMenuItem(hSubMenu, 1, true, ref sep); // Register item 2 (Submenu->ManageApp). item = menuItems[2]; RegisterMenuItem(2, idCmdFirst, item.Text, item.Bitmap, IntPtr.Zero, 2, hSubMenu); // Register item 3 (Submenu->ManageAll). item = menuItems[3]; RegisterMenuItem(3, idCmdFirst, item.Text, item.Bitmap, IntPtr.Zero, 3, hSubMenu); //Register user-defined profiles. //We should count down to 4. for (int i = menuItems.Count - 1; i > 3; i--) { item = menuItems[i]; if (item.ShowInMainMenu == true) { RegisterMenuItem((uint)i, idCmdFirst, item.Text, item.Bitmap, IntPtr.Zero, 1, hMenu); } else { RegisterMenuItem((uint)i, idCmdFirst, item.Text, item.Bitmap, IntPtr.Zero, 0, hSubMenu); } } // Add a separator. sep = new MENUITEMINFO(); sep.cbSize = (uint)Marshal.SizeOf(sep); sep.fMask = MIIM.MIIM_TYPE; sep.fType = MFT.MFT_SEPARATOR; NativeMethods.InsertMenuItem(hSubMenu, (uint)menuItems.FindAll(t => t.ShowInMainMenu != true).Count - 4, true, ref sep); // Return an HRESULT value with the severity set to SEVERITY_SUCCESS. // Set the code value to the total number of items added. return(WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, 3 + (uint)menuItems.Count)); }