背景: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-1つ以上の引数が無効です)。
誰かがここで何が悪いのかを理解するのを手伝ってもらえますか?または、このアイコンリソースを取得するためのより簡単な方法を教えてください。
編集:問題は私のSHSTOCKICONINFO定義にありました。以下を参照してください。上記の私の例は、以下の修正で正しく機能するようになりました。