[英]Call SHGetStockIconInfo from Python
背景:我正在尝试向基于 wxPython 的 Python 应用程序中的几个菜单选项添加一些 UAC 盾牌图标。 按钮我没有问题,因为我可以将 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 定义中,见下文。 我上面的示例现在可以通过下面的更正正常工作。
结构体的最后一个字段声明不正确。 您的代码将szPath
声明为指向以空字符结尾的数组的指针。 但实际上应该是:
('szPath', c_wchar*MAX_PATH)
查看该字段的C++ 声明:
WCHAR szPath[MAX_PATH];
这是一个MAX_PATH
宽字符的内联数组。 您可以像这样获取MAX_PATH
:
from ctypes.wintypes import MAX_PATH
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.