繁体   English   中英

从 Python 调用 SHGetStockIconInfo

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM