2

背景:我正在尝试将一些 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 定义中,见下文。我上面的例子现在可以在下面的更正下正常工作。

4

1 回答 1

2

结构的最终字段声明不正确。您的代码声明szPath为指向空终止数组的指针。但实际上应该是:

('szPath', c_wchar*MAX_PATH)

查看该字段的C++ 声明

WCHAR szPath[MAX_PATH];

那是MAX_PATH宽字符的内联数组。你可以MAX_PATH这样掌握:

from ctypes.wintypes import MAX_PATH
于 2012-11-26T23:20:30.373 回答