(AutoHotkey)(GUIのハンドルを得る方法 編)(改め GUIでメッセージを処理する方法 編)
まぁ 普通に考えて GUIを生成して その GUIのハンドルを得るには
これで ほぼ間違いなく GUIのハンドルを取得する事が出来ます
ならいいじゃん!!?
めでたしめでたし と言いたい所ですが
なんか気持ち悪い!! と思うのは私だけでしょうか? 笑)
そうですね
GUIを Show してから 次の アクティブなハンドルを得るまでは 極々々々短い時間なので
普通に考えて間違いが起こることは 「まず」ありえませんが
万が9999(笑) 成功しても、 奇跡のタイミングで 万が1 失敗する事はありうるんですよね
それが なんか 気持ち悪い原因なんですね
はっきり言って 「神経質すぎる」事ですが、 でも こういうのが 大惨事を産むわけです
ということで この奇跡のタイミングすら 潰してしまう コーディングを考えてみます
まぁ どうすればいいのか は 簡単に予想が付くとは思いますが
ウインドウメッセージ を利用するのが手っ取り早いはずです
AHKには GUIに対する メッセージを処理するための
擬似コールバック関数が使用できるように準備されていますよね
OnMessage関数ですね、 まず この関数で 擬似コールバックを定義します
処理すべきメッセージは WM_CREATE = 0x1 ですので
ということで 次は OnGuiCreate関数を実際に コーディングするわけですが
この関数では あくまで 「このウインドウのハンドルを取得することだけ」を考えるようにします
これで GUI が 生成される時に 毎度そのウインドウの ハンドルが
hLastCreatedGui に セットされるようになります
タイミングとしては GUIに対して 最初の処理をした直後
つまり コントロールを配置したり ウインドウのスタイルの変更などした時点で 実行されます
ので 起動直後 または Destroy直後の
最初の Gui, 1:Add や Gui, 2:Add の 直後に ハンドルを 変数に保存すればいいでしょう
それでは二つのGUIのハンドルを得るサンプルプログラムです(コピペして実行すれば動きます)
まぁ わざわざ これほどの事をやる必要は無いんですが
Messageを処理できるということは AHKに用意されている事の限界を突破できるってことなんですよ
むしろ このサンプルは メッセージ処理をする方法 についての意味合いが強かったりするんですね 笑)
WM_ で始まる WindowMessageの 一覧表を見てみると いろいろと やりたい事が見つかったりするかも? 笑)
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の 一覧表を見てみると いろいろと やりたい事が見つかったりするかも? 笑)