背景:我正在尝试将一些 UAC 盾牌图标添加到基于 wxPython 的 Python 应用程序中的一些菜单选项中。按钮我没有问题,因为我可以将 BCM_SETSHIELD 消息发送到按钮,Windows 会处理其余的。
在此处的链接MSDN 文章中,它描述了调用 SHGetStockIconInfo 以获取盾牌图标的句柄或位置。我正在尝试使用以下代码通过 Python 调用它:
from ctypes import *
class SHSTOCKICONINFO(Structure):
_fields_ = [('cbSize',c_ulong),
('hIcon',c_void_p),
('iSysImageIndex',c_int),
('iIcon',c_int),
('szPath',c_wchar_p)]
_SHGetStockIconInfo = windll.shell32.SHGetStockIconInfo
_SHGetStockIconInfo.argtypes = [c_uint,c_uint,POINTER(SHSTOCKICONINFO)]
_SHGetStockIconInfo.restype = c_int
# Values copied from shellapi.h
SIID_SHIELD = 77
SHGSI_ICONLOCATION = 0
SHGSI_ICON = 0x100
SHGSI_SMALLICON = 0x1
SHGSI_LARGEICON = 0
def GetIconLocation(id,flags=SHGSI_LARGEICON):
# Clear _ICON bit and set _ICONLOCATION bit
flags = ~(~flags|SHGSI_ICON)|SHGSI_ICONLOCATION
info = SHSTOCKICONINFO()
info.cbSize = sizeof(SHSTOCKICONINFO)
result = _SHGetStockIconInfo(id,flags,byref(info)):
if result != 0:
raise Exception(result)
return (info.szPath,info.iIcon)
现在,每当我调用它时,我都会从 SHGetStockIconInfo 获得 0x80070057 的返回结果(E_INVALIDARG - 一个或多个参数无效)。
谁能帮忙弄清楚这里出了什么问题?或者也许给我一个更简单的方法来获取这个图标资源?
编辑:问题出在我的 SHSTOCKICONINFO 定义中,见下文。我上面的例子现在可以在下面的更正下正常工作。