Thanks, I had exactly the same problem ! Here my new code, if it can help someone esle :)
\[StructLayout(LayoutKind.Sequential)\]
public struct MENUITEMINFO
{
public uint cbSize;
public uint fMask;
public uint fType;
public uint fState;
public uint wID;
public IntPtr hSubMenu;
public IntPtr hbmpChecked;
public IntPtr hbmpUnchecked;
public IntPtr dwItemData;
public string dwTypeData;
public uint cch;
public IntPtr hbmpItem;
}
public class DllImports
{
\[DllImport("user32.dll")\]
public static extern bool InsertMenuItem(IntPtr hMenu, uint uPosition, uint uFlags, \[In\] ref MENUITEMINFO mii);
\[DllImport("user32")\]
public static extern UInt32 SetMenuItemBitmaps(IntPtr hMenu, uint uPosition, uint uFlags, IntPtr hBitmapUnchecked, IntPtr hBitmapChecked);
}
private void AddMenuItem(IntPtr hMenu, uint id, uint position, string text, Bitmap icon, IntPtr? hSubMenu)
{
MENUITEMINFO mii = new MENUITEMINFO();
mii.cbSize = (uint)Marshal.SizeOf(typeof(MENUITEMINFO)); //48;
mii.fMask = (uint)MIIM.ID | (uint)MIIM.STRING | (uint)MIIM.SUBMENU;
mii.wID = id;
mii.dwTypeData = text;
if (hSubMenu.HasValue)
{
mii.hSubMenu = hSubMenu.Value;
}
DllImports.InsertMenuItem(hMenu, position, (uint)MF.BYPOSITION, ref mii);
if (icon != null)
{
DllImports.SetMenuItemBitmaps(hMenu, id, (uint)MF.BYCOMMAND, icon.GetHbitmap(), icon.GetHbitmap());
}
}
The biggest problem was this line :
mii.cbSize = (uint)Marshal.SizeOf(typeof(MENUITEMINFO)); //48;
As in all exemples you found on web, the size is set to 48 by default and not calculate. Thanks again. Decco