掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
マウスフックをグローバルフックにするには (ID:52386)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
スクリーン上でドラッグして指定した長方形中の画像を取り込み、 デスクトップや他のアプリの画像を変換して表示するプログラムを 作ろうと考えています。その際に作製したプログラムのウィンドウ 以外の領域もクリックしなければならないので、色々調べフックを 使う事にしました。 ところが、いざマウスのフックプロシージャをDLLに定義して、 グローバル(システム)フックにしてみても、ローカルフックの ような動きしかしません。そのアプリ上のタイトルバー等でも フックできているのですが、デスクトップ等の領域上では全く メッセージがフックされていないようです。 ネットに落ちていたサンプルコードを元にMFCでのコードに書き 直したのですが(私、MFCしか知らないもので…すいません…) 主要な部分は変えてないつもりです。 だから、exe側でMFC AppWizardを使っているのがいけないのかな とも考えているのですが、それ以外の可能性が全くつかめません。 お手数おかけしますが、よろしくお願いします。 ソースコードの主要な部分です。 ・DLLのインスタンスを取得するための関数を定義しました。 HINSTANCE ThisDllInst = NULL; HINSTANCE GetThisDllInst(){return ThisDllInst;} ・その関数のための変数をDllMainで設定しました。 extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { ThisDllInst = hInstance; ・マウスフックの登録部分です。 MouseHook = SetWindowsHookEx (WH_MOUSE,(HOOKPROC)MouseProc,GetThisDllInst(),0); ・フックに関連する変数です。 #pragma data_seg(".ShareForHook")←.defのSECTIONSでREAD WRITE SHARED HHOOK MouseHook = NULL; #pragma data_seg() ・フックプロシージャです LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam) { // マウスメッセージでなければ、次のフックプロシージャを呼ぶ if(nCode != HC_ACTION) return CallNextHookEx(MouseHook,nCode,wParam,lParam); switch(wParam) { case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: case WM_NCMOUSEMOVE: デスクトップ上等でマウスを操作しても、 ここのラベルに処理が移らない。 (略) return 1; // 他のメッセージはそのまま default: return CallNextHookEx(MouseHook,nCode,wParam,lParam); } }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.