GUIフォームにプログラムのアイコンを表示する例はすべて、アイコンを表示する場所を示すためにテキストコントロールを使用しているように見えますが、実際に画像を表示するためにSTM_SETICONメッセージを送信します。ただし、マウス クリックを処理するテキスト コントロールのイベント サブルーチンは、表示されたアイコンをクリックしても呼び出されません。独自のイベント サブルーチンを使用してアイコンの上に透明なグラフィック領域を表示することを検討しましたが、イベント ハンドラーをアイコンの表示領域に直接アタッチするか、独自のイベント ハンドラーを使用してアイコンをグラフィック コントロールに読み込むことができるように思われます。
これらのいずれかを行う方法を知っている人はいますか?
Windows 7 Pro で AutoHotKey L (v 1.1.09.04) 64 ビットを使用しています。
これは、現在使用しているアイコンを表示する方法を探しているときに見つけたコードです。
FileName := "C:\XXXX\XXXX.exe" ; Get the icon from a program file.
Ignored := 0
;
; CopyImage into memory and scale it to size.
;
IMAGE_ICON := 1
LR_COPYFROMRESOURCE := 4
LR_COPYDELETEORG := 8
IconSize := 16 ; Icon size: X by X
ptr := ( ( A_PtrSize = 8 ) ? "ptr" : "uint" )
sfi_size := A_PtrSize + 8 + ( ( A_IsUnicode ) ? 680 : 340 )
VarSetCapacity( sfi, sfi_size )
DllCall( "Shell32\SHGetFileInfo" . ( ( A_IsUnicode ) ? "W" : "A" )
, "str", FileName
, "uint", Ignored
, ptr, &sfi
, "uint", sfi_size
, "uint", SHGFI_ICON )
hIcon := NumGet( sfi, 0 )
hicon_resized := DllCall( "CopyImage"
, ptr, hicon
, "uint", IMAGE_ICON
, "int", IconSize
, "int", IconSize
, "uint", LR_COPYFROMRESOURCE | LR_COPYDELETEORG
, ptr )
DllCall( "DestroyIcon", ptr, hicon )
STM_SETICON := 0x0170
Gui, Add, Text, x5 y8 w%IconSize% h%IconSize% hwndMyPic %SS_ICON% gClicked
SendMessage, STM_SETICON, hicon_resized, 0,, Ahk_ID %MyPic%
アイコンを変更してスクリプトに埋め込み、タスクバーとトレイのアイコンとしても使用したいのですが、スクリプトをコンパイルしなくてもすべて機能するようにしたいと考えています。