GetMenuItemInfo,但i´;我得到了一个1456-“;菜单项未找到”;

本文关键字:1456- 一个 菜单项 #180 GetMenuItemInfo | 更新日期: 2023-09-27 18:27:16

我试图知道菜单项是被禁用还是被启用,但我得到了一个1456-"找不到菜单项"我做错了什么

第一部分是win32库的声明。

menuIndex是一个参数intsubmenuIndex是中的另一个参数

    [StructLayout(LayoutKind.Sequential)]
    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;
        // return the size of the structure
        public static uint sizeOf
        {
            get { return (uint)Marshal.SizeOf(typeof(MENUITEMINFO)); }
        }
    }
[DllImport("user32.dll")]
private static extern IntPtr GetMenu(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern IntPtr GetSubMenu(IntPtr hMenu, int nPos);
[DllImport("user32.dll")]
private static extern uint GetMenuItemID(IntPtr hMenu, int nPos);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool GetMenuItemInfo(IntPtr hMenu, int uItem, bool fByPosition, ref MENUITEMINFO lpmii);
....
IntPtr menu = GetMenu(handle);
IntPtr subMenu = GetSubMenu(menu, menuIndex);
uint menuItemID = GetMenuItemID(subMenu, submenuIndex);
MENUITEMINFO itemInfo = new MENUITEMINFO();
uint MIIM_STATE = 0x00000001;
itemInfo.cbSize = MENUITEMINFO.sizeOf;
itemInfo.fMask = MIIM_STATE;
if (!GetMenuItemInfo(menu, (int)submenuIndex, false, ref itemInfo))
{
    uint erro = GetLastError();
    //erro = 1456
    throw new Exception("Ocorreu um erro ao obter informações do Menu Centura - Cod: "+Marshal.GetLastWin32Error().ToString() +"'n http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx");
}                    
if (itemInfo.fState == MFS_DISABLED)
    throw new Exception("Disabled");
PostMessage(handle, 0x0111, (IntPtr)menuItemID, IntPtr.Zero);

GetMenuItemInfo,但i´;我得到了一个1456-“;菜单项未找到”;

fByPosition参数传递false,因此需要传递菜单ID(menuItemID),而不是索引(submenuIndex)。您还需要向包含该项的菜单传递一个句柄(subMenu,而不是menu)。

文件显示

fByPosition[in]

型号:BOOL

uItem。如果此参数为FALSE,则uItem是菜单项标识符。否则,它是一个菜单项位置。有关详细信息,请参阅以编程方式访问菜单项。

其中任何一种都可能起作用:

GetMenuItemInfo(subMenu, (int)submenuIndex, true, ref itemInfo)
GetMenuItemInfo(subMenu, (int)menuItemID, false, ref itemInfo)
相关文章: