こんばんは。
システムにマウスフックをかけてメッセージを捕まえるアプリを作っています。
dllにてシステム全体のマウスメッセージを捕まえて、それをexeへ送るところまでは何とかできるようになりましたが、このdllを作っている間ずっと困ったことがあり、それつにいて質問させて下さい。
たとえば、以下のコードの <- の部分にブレークポイントを貼ったとき、
自アプリ内で、クリックしたときには止まってくれるのですが、ほかのアプリのウィンドウ内でクリックしたときは止まってくれません。
止まらないだけで、メッセージ自体は捕まえていて、そのあとexeには、WM_MDOWNメッセージが送られています。
この為に、デバッグにとても苦労します。
なぜこのようになるのかご存じの方いらっしゃいましたらご指導下さいませ。
よろしくお願いします。
EXPORT LRESULT CALLBACK MouseHookProc( int nCode, WPARAM wp, LPARAM lp){
if ( nCode < 0)
return CallNextHookEx( hMouseHook, nCode, wp, lp);
switch( wp){
case WM_MBUTTONDOWN:
PostMessage( hWndApp, WM_MDOWN, wp, lp); <- ここ
return TRUE;
}
return CallNextHookEx( hMouseHook, nCode, wp, lp);
}
dll内にブレークポイントを貼ったとき、
書き忘れました。
環境は Windows2000 + sp3 / VC++6 + sp5 / SDK
です。
>なぜこのようになるのかご存じの方いらっしゃいましたらご指導下さいませ。
ウィンドウで発生したイベントを捕らえる時、フック .dll はそのウィンドウを所有す
るプロセス空間に一時的に押し込まれ、そのプロセスのコンテキストでフックプロシー
ジャが実行されるからです。
渋木宏明(ひどり)さんありがとうございます。
よそで起きたイベントはこちらからは制御できないということですか。
このようなときはふつうどのようにしてデバッグをするのでしょうか。
引き続きおねがいします。
> このようなときはふつうどのようにしてデバッグをするのでしょうか。
・MessageBoxやファイルに変数の値を出力して
うまくいっているか確認する。
・VCをもう1つ立ち上げて、別のプロセスにデバッガをアタッチする。
[ビルド]-[デバッグの開始]-[プロセスへアタッチ]
など。
>よそで起きたイベントはこちらからは制御できないということですか。
制御ではなく、よそ(他プロセス)で起きたイベントは、こちらに通知されないという
ことです。
デバッグ方法については、すでにコメントについているように、ログファイルなどに実
行結果を記録していけばよいと思います。
渋木宏明(ひどり) さん、dairygoods さんありがとうございます。
実はこれまではMessageBoxを使っていたのですが、どうしてもつかみきれない部分があり、
質問させていただきました。
MesageBoxだと、いちいち閉じるのが面倒だったのでファイルに記録して追いかけてみます。