フック時のメッセージ処理 – プログラミング – Home

フック時のメッセージ処理
 
通知
すべてクリア

[解決済] フック時のメッセージ処理


ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

 たびたびお世話になります。VC++6.0 MFCで開発を行っています。先ほどライン描画に
ついて質問させて頂きました者です。
 
 フック内のことで伺いたいことがあります。現在 DLL内でマウスフックで以下のよう
な処理をしています。
 a) マウスの左ボタンをドラッグ中にラバーバンド(矩形)を描画する
 b)左ボタンが離されたら 呼び出し側のexeにメッセージを送り矩形領域をファイルに
保存する

 しかしながら フックを行っているアプリ(ウィンドウ)上では a), b )の処理が正
常に処理されているのですが、デスクトップ上では正常にexeにメッセージが送れていな
い(詳細は下記のi) )のはなぜなのでしょうか??
 疑問として以下の点があります。

i) デスクトップ上でも矩形の描画は正常にできるのに DLL内のブレークポイントで
デバッグできない(WM_LBUTTONUPとかのメッセージが飛んでこない)のはなぜ??
 ※正常にできるという意味は ペンの色や サイズを変更しても デスクトップ上に描
画するときに反映されているという意味で書きました。

ii) アプリ(呼び出し側のexe)上では a), b) を処理行った際には DLL内のブレーク
ポイントでデバッグできるのはなぜ??

iii) これはフックのやり方が悪いのでしょうか??
   フックは 共有メモリを使用していません。

以上 長々となりましたがご教授よろしくお願いします。


引用未解決
トピックタグ
ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

 先ほどの追記です。
 デスクトップ上でラバーバンド(矩形描画)ができると記述できましたが ドラッグ
中に他のアプリのウィンドウ領域にはラバーバンドできません。
 自アプリ内のウィンドウ領域および デスクトップ上のみラバーバンドの描画ができ
ているみたいです。---> これって ローカルフックなのかな??


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

> 自アプリ内のウィンドウ領域および デスクトップ上のみラバーバンドの描画ができ
>ているみたいです。---> これって ローカルフックなのかな??

とりあえずフック プロシージャを

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION) {
return 1;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}

とでも定義しておいて、
実行してマウスメッセージを受け付けなくなったら
グローバルフックは成功していると思われます。
#アプリ自体はキーボードから終了。
#ちょっと強引かな。

それにしてもこういう処理ってデスクトップと同じ大きさの
ダミーウインドウを用意して、その上で処理させるタイプのものも
多いと思うんですけど、完璧にやるならグローバルフックなんですかね。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> i) デスクトップ上でも矩形の描画は正常にできるのに DLL内のブレークポイント
> でデバッグできない(WM_LBUTTONUPとかのメッセージが飛んでこない)のはなぜ??

Windows のデバッガ(VisualStudio も含む)は、デバッグ対象のプロセスにアタッチ
(接続)することによって、デバッグイベント(例えば、実行地点がブレークポイント
に達したとか)を取得します。
グローバルフックの DLL は任意のプロセスに読み込まれますが、VisualStudio がその
プロセスにアタッチしていないと、デバッグイベントは取得できません。というより、
そもそも、対象のプロセスに対してブレークポイントを仕掛けることさえできていない
でしょう。
対象としているプロセスでデバッグを行いたいのであれば、DLL プロジェクトのプロパ
ティで、起動する exe を対象プログラムにしてください。
ただし、その場合、デバッグを中止すると、対象プログラムも強引に中断されますが。


返信引用
ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

subaruさん。シャノンさん。ありがとうございます。

>実行してマウスメッセージを受け付けなくなったら
>グローバルフックは成功していると思われます。
 はい。どうやらグローバルフックはできていたみたいです。

>対象としているプロセスでデバッグを行いたいのであれば、DLL プロジェクトのプロパ
>ティで、起動する exe を対象プログラムにしてください。
 おかげさまで、きちんとデバッグできました。

>デスクトップ上では正常にexeにメッセージが送れていない(詳細は下記のi) )のはな
>ぜなのでしょうか??
 自分の質問した内容でしたが、共有メモリを使用することにより自力で無事問題解決
しました。

 今後もなにかありましたらぜひよろしくお願いします


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました