将子菜单添加到资源管理器上下文菜单
Adding submenu's to explorer context menu
我有一些基于 this 的代码,它允许我为 windows 资源管理器上下文菜单添加额外的功能。我已经能够成功地完成这项工作。
但是我现在想将多个项目添加到上下文菜单中,并将其添加到子菜单中。但是我似乎无法解决问题,首先是如何将子菜单添加到其中,然后是如何 link 将额外的项目添加到该菜单中。
// Use either InsertMenu or InsertMenuItem to add menu items.
MENUITEMINFO mii = new MENUITEMINFO();
mii.cbSize = (uint)Marshal.SizeOf(mii);
mii.fMask = MIIM.MIIM_BITMAP | MIIM.MIIM_STRING | MIIM.MIIM_FTYPE |
MIIM.MIIM_ID | MIIM.MIIM_STATE;
mii.wID = idCmdFirst + IDM_DISPLAY;
mii.fType = MFT.MFT_STRING;
mii.dwTypeData = this.menuText;
mii.fState = MFS.MFS_ENABLED;
mii.hbmpItem = this.menuBmp;
if (!NativeMethods.InsertMenuItem(hMenu, iMenu, true, ref mii))
{
return Marshal.GetHRForLastWin32Error();
}
这是我当前必须添加项目的代码。不确定我需要如何为子菜单修改它,以及如何 link 多个项目的点击操作。
有一个 shellExtLib,它定义了大部分内容,看起来它只是从 user32.dll 导入内容。还定义了一个 InvokeCommand() ,这是我实际的 "action-taking" 代码所在的位置。
这是我最终得到的解决方案:
private MENUITEMINFO CreateSubMenu(string menuText, IntPtr menuIcon, IntPtr hSubMenu, bool isEnabled = true)
{
MENUITEMINFO subMenu = new MENUITEMINFO();
subMenu.cbSize = (uint)Marshal.SizeOf(subMenu);
subMenu.fMask = MIIM.MIIM_BITMAP | MIIM.MIIM_SUBMENU | MIIM.MIIM_STRING | MIIM.MIIM_FTYPE | MIIM.MIIM_STATE;
subMenu.hSubMenu = hSubMenu;
//subMenu.wID = itemID;
subMenu.fType = MFT.MFT_STRING;
subMenu.dwTypeData = menuText;
subMenu.fState = isEnabled ? MFS.MFS_ENABLED : MFS.MFS_DISABLED;
subMenu.hbmpItem = menuIcon;
//itemID++;
return subMenu;
}
结合:
IntPtr hSubMenu = NativeMethods.CreatePopupMenu();
[DllImport("user32.dll")]
public static extern IntPtr CreatePopupMenu();
我有一些基于 this 的代码,它允许我为 windows 资源管理器上下文菜单添加额外的功能。我已经能够成功地完成这项工作。
但是我现在想将多个项目添加到上下文菜单中,并将其添加到子菜单中。但是我似乎无法解决问题,首先是如何将子菜单添加到其中,然后是如何 link 将额外的项目添加到该菜单中。
// Use either InsertMenu or InsertMenuItem to add menu items.
MENUITEMINFO mii = new MENUITEMINFO();
mii.cbSize = (uint)Marshal.SizeOf(mii);
mii.fMask = MIIM.MIIM_BITMAP | MIIM.MIIM_STRING | MIIM.MIIM_FTYPE |
MIIM.MIIM_ID | MIIM.MIIM_STATE;
mii.wID = idCmdFirst + IDM_DISPLAY;
mii.fType = MFT.MFT_STRING;
mii.dwTypeData = this.menuText;
mii.fState = MFS.MFS_ENABLED;
mii.hbmpItem = this.menuBmp;
if (!NativeMethods.InsertMenuItem(hMenu, iMenu, true, ref mii))
{
return Marshal.GetHRForLastWin32Error();
}
这是我当前必须添加项目的代码。不确定我需要如何为子菜单修改它,以及如何 link 多个项目的点击操作。
有一个 shellExtLib,它定义了大部分内容,看起来它只是从 user32.dll 导入内容。还定义了一个 InvokeCommand() ,这是我实际的 "action-taking" 代码所在的位置。
这是我最终得到的解决方案:
private MENUITEMINFO CreateSubMenu(string menuText, IntPtr menuIcon, IntPtr hSubMenu, bool isEnabled = true)
{
MENUITEMINFO subMenu = new MENUITEMINFO();
subMenu.cbSize = (uint)Marshal.SizeOf(subMenu);
subMenu.fMask = MIIM.MIIM_BITMAP | MIIM.MIIM_SUBMENU | MIIM.MIIM_STRING | MIIM.MIIM_FTYPE | MIIM.MIIM_STATE;
subMenu.hSubMenu = hSubMenu;
//subMenu.wID = itemID;
subMenu.fType = MFT.MFT_STRING;
subMenu.dwTypeData = menuText;
subMenu.fState = isEnabled ? MFS.MFS_ENABLED : MFS.MFS_DISABLED;
subMenu.hbmpItem = menuIcon;
//itemID++;
return subMenu;
}
结合:
IntPtr hSubMenu = NativeMethods.CreatePopupMenu();
[DllImport("user32.dll")]
public static extern IntPtr CreatePopupMenu();