2012-11-26 40 views
2

背景:我正在嘗試在我的基於wxPython的Python應用程序中爲一些菜單選項添加一些UAC屏蔽圖標。按鈕我沒有問題,因爲我只能將BCM_SETSHIELD消息發送到按鈕,而Windows則處理剩餘的按鈕。來自Python的調用SHGetStockIconInfo

在鏈接MSDN article here中,它描述了調用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) 

現在,每當我稱呼它,我從80070057 SHGetStockIconInfo(E_INVALIDARG - 一個或多個參數是無效的),得到一個返回結果。

任何人都可以幫助弄清楚這裏有什麼問題嗎?或者,也許讓我更容易獲得這個圖標資源?

編輯:問題出在我的SHSTOCKICONINFO定義中,見下文。我上面的示例現在可以正確使用下面的更正。

回答

2

該結構的最後一個字段被錯誤地聲明。您的代碼聲明szPath是一個指向空終止數組的指針。但實際上它應該是:

('szPath', c_wchar*MAX_PATH) 

看看在C++ declaration該字段:

WCHAR szPath[MAX_PATH]; 

這就是MAX_PATH寬字符數組內聯。你可以像這樣得到MAX_PATH

from ctypes.wintypes import MAX_PATH 
+0

完美,謝謝!我會用正確的答案更新我的問題。 – Lojack

+1

@Lojack無需這樣做。最好把問題保持原樣。你接受這個答案足以表明答案可以解決問題。 –