Python 中的 Win32 - LoadImage 获取图标句柄但 InsertMenuItem 抛出错误

问题描述 投票:0回答:0

我正在尝试为 Python 的系统托盘库中的每个菜单选项添加一个图标,pystray。为此,我使用的是 win32 函数,我可以使用 LoadImage 函数成功加载扩展名为 .ico 的图标,并获得它的句柄(HBITMAP),下次我尝试在 MENUITEMINFO 结构中使用该句柄作为 InsertMenuItem 函数中的第 4 个参数传递给错误 WinError 87.

现在说说细节,例如:

            icon = win32.LoadImage(
                None,
                iconpath,
                win32.IMAGE_ICON,
                ico_x,
                ico_y,
                win32.LR_LOADFROMFILE)

成功返回一个 HBITMAP,但是在填充 MENUITEMINFO 结构之后:


menu_item = win32.MENUITEMINFO(
            cbSize=ctypes.sizeof(win32.MENUITEMINFO),

            fMask=win32.MIIM_ID | win32.MIIM_STRING | win32.MIIM_STATE
            | win32.MIIM_FTYPE | win32.MIIM_SUBMENU | win32.MIIM_BITMAP ,

            wID=len(callbacks),

            dwTypeData=descriptor.text,

            fState=0
                  | (win32.MFS_DEFAULT if descriptor.default else 0)
                  | (win32.MFS_CHECKED if descriptor.checked else 0)
                  | (win32.MFS_DISABLED if not descriptor.enabled else 0),

            fType=0
                 | (win32.MFT_RADIOCHECK if descriptor.radio else 0)
                 | (win32.MFT_STRING if descriptor.text else 0) ,

                 hbmpItem= icon if descriptor.icon else None,

                 hSubMenu=self._create_menu(descriptor.submenu, callbacks)
                     if descriptor.submenu
                     else None)

descriptor
这里是一个变量,它保存菜单项的参数(它的文本,如果它有复选标记,等等)。

一切都上升到:

                win32.InsertMenuItem(hmenu, i, True, ctypes.byref(menu_item))

其中

menu_item
是上面填写的MENUITEMINFO类型的变量。 当我调试时,我可以看到 hbmpItem 正确填充了 HBITMAP 长值。 但是这个功能失败了
OSError:WinError 87: The parameter is incorrect
.

奇怪的是,如果我使用 BMP 文件,并且在 LoadImage 函数中我会这样做:

           icon = win32.LoadImage(
                None,
                bmppath,
                win32.IMAGE_BITMAP,
                ico_x,
                ico_y,
                win32.LR_LOADFROMFILE)

InserMenuItem
功能一切正常。

win32
API 经验的人可以给我提示我做错了什么吗?

python winapi pystray
© www.soinside.com 2019 - 2024. All rights reserved.