フックした他プロセス上のボタンコントロールIDを取得するには?

解決


むー  2009-07-10 18:40:44  No: 70542

現在,他プロセス上のボタン押下をフックするプログラムを作成中です。
環境は,
・XP
・VC++6.0,MFC
です。  

ここで,自作フックプログラムをApp1,他プロセスをApp2とします。
App2は単純なダイアログベースのアプリです。App2のインタフェースは,フォーム上にボタンが3つ(B1,B2,B3とします)あるのみです。今回の目的は,App2上のボタンB1を押した反応をApp1上で取得することです。

現状で,フック自体は成功しています。しかし,App2上のボタンB1,B2,B3を認識することができません。今,フックを行うSetWindowsHookEx関数が呼び出しているプロシージャが取得してくるWPARAM wParam, LPARAM lParamという変数に着目して作業を進めています。つまり,wParamからはApp2のWMを取得できるわけですが,lParamからボタンのコントロールIDを取得できないかと考えている次第です。実際,GetDlgCtrlIDをつかって,lParamから取得してる例を見てそう思ったのですが,なんともうまくいきません。

どなたか,知恵を拝借できませんでしょうか?
以上,よろしくお願いいたします。


オショウ  2009-07-10 19:32:42  No: 70543

フックする前等にて・・・
FindWindowにてApp2を探し、EnumChildWindowsで子ウィンドウを列挙
この際、該当するボタン抽出するように指定。(多分できるはず)
ボタンの子ウィンドウのハンドルを取得したら
GetDlgCtrlIDで、コントロールIDを取得

如何?

以上。


むー  2009-08-07 16:18:19  No: 70544

オショウ様

FindWindowを使ってやりたいことが実現できました。
FindWindowでターゲットの子ウィンドウを取得後,そのウィンドウ内にある
ターゲットとなるボタンのキャプションを手がかりにそのボタンのハンドルを取得。ハンドル取得後は任意のタイミングでSendMessage(WM_LBUTTONDOWN...)とSendMessage(WM_LBUTTONUP...)を送信することで,外部アプリから他のアプリ上にあるボタンをコントロールすることができました。

ありがとうございました。解決とさせていただきます。


むー  2009-08-07 16:19:17  No: 70545

解決ボタンを押すのを忘れました。すいません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加