現在,他プロセス上のボタン押下をフックするプログラムを作成中です。
環境は,
・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から取得してる例を見てそう思ったのですが,なんともうまくいきません。
どなたか,知恵を拝借できませんでしょうか?
以上,よろしくお願いいたします。
フックする前等にて・・・
FindWindowにてApp2を探し、EnumChildWindowsで子ウィンドウを列挙
この際、該当するボタン抽出するように指定。(多分できるはず)
ボタンの子ウィンドウのハンドルを取得したら
GetDlgCtrlIDで、コントロールIDを取得
如何?
以上。
オショウ様
FindWindowを使ってやりたいことが実現できました。
FindWindowでターゲットの子ウィンドウを取得後,そのウィンドウ内にある
ターゲットとなるボタンのキャプションを手がかりにそのボタンのハンドルを取得。ハンドル取得後は任意のタイミングでSendMessage(WM_LBUTTONDOWN...)とSendMessage(WM_LBUTTONUP...)を送信することで,外部アプリから他のアプリ上にあるボタンをコントロールすることができました。
ありがとうございました。解決とさせていただきます。
解決ボタンを押すのを忘れました。すいません。
ツイート | ![]() |