(AutoHotkey)(GUIのハンドルを得る方法 編)(改め GUIでメッセージを処理する方法 編)

 まぁ 普通に考えて GUIを生成して その GUIのハンドルを得るには
	Gui, 1:Show, W300 H300
	hGUI := WinExist("A")
で十分ですし
これで ほぼ間違いなく GUIのハンドルを取得する事が出来ます

ならいいじゃん!!?

 めでたしめでたし と言いたい所ですが
なんか気持ち悪い!! と思うのは私だけでしょうか? 笑)
そうですね
GUIを Show してから 次の アクティブなハンドルを得るまでは 極々々々短い時間なので
普通に考えて間違いが起こることは 「まず」ありえませんが
万が9999(笑) 成功しても、 奇跡のタイミングで 万が1 失敗する事はありうるんですよね
それが なんか 気持ち悪い原因なんですね
はっきり言って 「神経質すぎる」事ですが、 でも こういうのが 大惨事を産むわけです

 ということで この奇跡のタイミングすら 潰してしまう コーディングを考えてみます
まぁ どうすればいいのか は 簡単に予想が付くとは思いますが
ウインドウメッセージ を利用するのが手っ取り早いはずです

 AHKには GUIに対する メッセージを処理するための
擬似コールバック関数が使用できるように準備されていますよね
OnMessage関数ですね、 まず この関数で 擬似コールバックを定義します
処理すべきメッセージは WM_CREATE = 0x1 ですので
	OnMessage(0x1, "OnGuiCreate")
これで GUIが生成されようとしている時に OnGuiCreate関数が呼び出されるようになります

 ということで 次は OnGuiCreate関数を実際に コーディングするわけですが
この関数では あくまで 「このウインドウのハンドルを取得することだけ」を考えるようにします
OnGuiCreate(wParam,lParam,Message,hWnd)
{
	global hLastCreatedGui
	hLastCreatedGui := hWnd
	Return
}

 これで GUI が 生成される時に 毎度そのウインドウの ハンドルが
hLastCreatedGui に セットされるようになります

 タイミングとしては GUIに対して 最初の処理をした直後
つまり コントロールを配置したり ウインドウのスタイルの変更などした時点で 実行されます
ので 起動直後 または Destroy直後の
最初の Gui, 1:Add や Gui, 2:Add の 直後に ハンドルを 変数に保存すればいいでしょう
; コレだとNG
; hGUI_A にも hGUI_B にも WindowBのハンドルが入ってしまう

	Gui, 1:Add, Text, , Window            A
	Gui, 2:Add, Text, , Window            B

	Gui, 1:Show
	hGUI_A := hLastCreatedGui

	Gui, 2:Show
	hGUI_B := hLastCreatedGui


; コレならOK!! Gui, 1:Add, Text, , Window A hGUI_A := hLastCreatedGui Gui, 2:Add, Text, , Window B hGUI_B := hLastCreatedGui Gui, 1:Show Gui, 2:Show


 それでは二つのGUIのハンドルを得るサンプルプログラムです(コピペして実行すれば動きます)
	OnMessage(0x1, "OnGuiCreate")
	Gui, 1:Add, Text, , Window                       A
	hGUI_A := hLastCreatedGUI
	Gui, 2:Add, Text, , Window                       B
	hGUI_B := hLastCreatedGUI
	Gui, 1:Show
	Gui, 2:Show
	MsgBox,% hGUI_A . "  WindowA`n" . hGUI_B . "  WindowB"
	ExitApp
OnGuiCreate(wParam,lParam,Message,hWnd)
{
	global hLastCreatedGui
	hLastCreatedGui := hWnd
	Return
}

 まぁ わざわざ これほどの事をやる必要は無いんですが
Messageを処理できるということは AHKに用意されている事の限界を突破できるってことなんですよ
むしろ このサンプルは メッセージ処理をする方法 についての意味合いが強かったりするんですね 笑)
WM_ で始まる WindowMessageの 一覧表を見てみると いろいろと やりたい事が見つかったりするかも? 笑)