getmenuitemid (user32)
Last changed: gaddas-77.70.108.196

.
Summary

C# Signature:

[DllImport("user32.dll")]
static extern uint GetMenuItemID(IntPtr hMenu, int nPos);

VB Signature:

<DllImport("user32.dll")> _
Public Shared Function GetMenuItemID(ByVal hMenu As IntPtr, ByVal nPos As Integer) As UInteger
End Function

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

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

Sample Code (VB)

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!

Alternative Managed API:

Do you know one? Please contribute it!

Documentation