2015-05-02 7 views
0

У меня есть код, основанный на this, что позволяет мне добавить дополнительную функциональность в контекстное меню проводника Windows. Я смог успешно получить эту работу.Добавление контекстного меню подменю в проводник

Однако теперь я хочу добавить несколько элементов в контекстное меню и добавить их в подменю. Однако я не могу понять, во-первых, как добавить в него подменю, а затем как связать лишние элементы внутри этого меню.

 // 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(); 
     } 

Это код, который я должен добавить в настоящее время. Непонятно, как мне нужно изменить это для подменю, а также как связать действие click для нескольких элементов.

Существует shellExtLib, который содержит большинство из этого материала, и выглядит так, как будто он импортирует материал из user32.dll. Существует также определенный InvokeCommand(), который является моим фактическим «действием».

ответ

0

Это решение, которое я закончил с:

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(); 
Смежные вопросы