我正在尝试为 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 经验的人可以给我提示我做错了什么吗?