たびたびお世話になります。VC++6.0 MFCで開発を行っています。先ほどライン描画に
ついて質問させて頂きました者です。
フック内のことで伺いたいことがあります。現在 DLL内でマウスフックで以下のよう
な処理をしています。
a) マウスの左ボタンをドラッグ中にラバーバンド(矩形)を描画する
b)左ボタンが離されたら 呼び出し側のexeにメッセージを送り矩形領域をファイルに
保存する
しかしながら フックを行っているアプリ(ウィンドウ)上では a), b )の処理が正
常に処理されているのですが、デスクトップ上では正常にexeにメッセージが送れていな
い(詳細は下記のi) )のはなぜなのでしょうか??
疑問として以下の点があります。
i) デスクトップ上でも矩形の描画は正常にできるのに DLL内のブレークポイントで
デバッグできない(WM_LBUTTONUPとかのメッセージが飛んでこない)のはなぜ??
※正常にできるという意味は ペンの色や サイズを変更しても デスクトップ上に描
画するときに反映されているという意味で書きました。
ii) アプリ(呼び出し側のexe)上では a), b) を処理行った際には DLL内のブレーク
ポイントでデバッグできるのはなぜ??
iii) これはフックのやり方が悪いのでしょうか??
フックは 共有メモリを使用していません。
以上 長々となりましたがご教授よろしくお願いします。
先ほどの追記です。
デスクトップ上でラバーバンド(矩形描画)ができると記述できましたが ドラッグ
中に他のアプリのウィンドウ領域にはラバーバンドできません。
自アプリ内のウィンドウ領域および デスクトップ上のみラバーバンドの描画ができ
ているみたいです。---> これって ローカルフックなのかな??
> 自アプリ内のウィンドウ領域および デスクトップ上のみラバーバンドの描画ができ
>ているみたいです。---> これって ローカルフックなのかな??
とりあえずフック プロシージャを
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION) {
return 1;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
とでも定義しておいて、
実行してマウスメッセージを受け付けなくなったら
グローバルフックは成功していると思われます。
#アプリ自体はキーボードから終了。
#ちょっと強引かな。
それにしてもこういう処理ってデスクトップと同じ大きさの
ダミーウインドウを用意して、その上で処理させるタイプのものも
多いと思うんですけど、完璧にやるならグローバルフックなんですかね。
> i) デスクトップ上でも矩形の描画は正常にできるのに DLL内のブレークポイント
> でデバッグできない(WM_LBUTTONUPとかのメッセージが飛んでこない)のはなぜ??
Windows のデバッガ(VisualStudio も含む)は、デバッグ対象のプロセスにアタッチ
(接続)することによって、デバッグイベント(例えば、実行地点がブレークポイント
に達したとか)を取得します。
グローバルフックの DLL は任意のプロセスに読み込まれますが、VisualStudio がその
プロセスにアタッチしていないと、デバッグイベントは取得できません。というより、
そもそも、対象のプロセスに対してブレークポイントを仕掛けることさえできていない
でしょう。
対象としているプロセスでデバッグを行いたいのであれば、DLL プロジェクトのプロパ
ティで、起動する exe を対象プログラムにしてください。
ただし、その場合、デバッグを中止すると、対象プログラムも強引に中断されますが。
subaruさん。シャノンさん。ありがとうございます。
>実行してマウスメッセージを受け付けなくなったら
>グローバルフックは成功していると思われます。
はい。どうやらグローバルフックはできていたみたいです。
>対象としているプロセスでデバッグを行いたいのであれば、DLL プロジェクトのプロパ
>ティで、起動する exe を対象プログラムにしてください。
おかげさまで、きちんとデバッグできました。
>デスクトップ上では正常にexeにメッセージが送れていない(詳細は下記のi) )のはな
>ぜなのでしょうか??
自分の質問した内容でしたが、共有メモリを使用することにより自力で無事問題解決
しました。
今後もなにかありましたらぜひよろしくお願いします