[DllImport("user32.dll")]
static extern uint GetMenuItemID(IntPtr hMenu, int nPos);
<DllImport("user32.dll")> _
Public Shared Function GetMenuItemID(ByVal hMenu As IntPtr, ByVal nPos As Integer) As UInteger
End Function
None.
None.
Please add some!
// Unmerges two menus
[DllImport("user32.dll")]
static extern uint GetMenuItemID(IntPtr hMenu, int nPos);
static MenuItem FindSubMenuID(Menu menu, uint id)
{
for (int i = 0; i<menu.MenuItems.Count; i++)
{
if (GetMenuItemID(menu.Handle, i) == id)
return menu.MenuItems[i];
}
return null;
}
/// <summary>
/// Unmerge menus previously merged with Menu.MergeMenu()
/// </summary>
/// <param name="DestMenu">Menu that contains SourceMenu</param>
/// <param name="SourceMenu">Menu to be removed from DestMenu</param>
public static void UnmergeMenu(Menu DestMenu, Menu SourceMenu)
{
int sourceItemCount = SourceMenu.MenuItems.Count;
for(int j=0; j<sourceItemCount; j++) // iterate all sub menu items of SourceMenu
{
MenuItem mis = SourceMenu.MenuItems[j];
uint id = GetMenuItemID(SourceMenu.Handle, j);
MenuItem mid = FindSubMenuID(DestMenu, id);
if (mid != null)
{
UnmergeMenu(mid, mis);
if (!mid.IsParent) // is empty?
DestMenu.MenuItems.Remove(mid);
break;
}
}
}
Dim hwndMain as IntPtr = FindWindowEx(intptr.Zero,intptr.Zero,vbNullString,"My Window Title") 'Get the Window Handle
Dim hwndMenu As IntPtr = GetMenu(hwndMain) 'Get the MenuHandle
Dim hwndSubmenu as intptr = GetSubMenu(hwndMenu,1) 'Get the SubMenuHandle to the visible MenuItem, in this case the second one (counting from zero)
Dim intMID as Integer = GetMenuitemID(hwndSubmenu,2)) 'Get the MenuItemID of the third SubMenu under the previous Handle (counting from zero)
Sendmessage(hwndMain, WM_COMMAND, intMID, 0) 'Click the MenuItem!
Do you know one? Please contribute it!