2

背景: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定義にありました。以下を参照してください。上記の私の例は、以下の修正で正しく機能するようになりました。

4

1 に答える 1

2

構造体の最後のフィールドが正しく宣言されていません。あなたのコードはszPathnullで終了する配列へのポインタであると宣言されました。しかし、実際には次のようになります。

('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 に答える