• 締切済み

グローバルフック

http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_setwindowshookex.htm に フックタイプがスレッドとグローバルの両方をサポートしている場合、最初にスレッドフックが呼び出され、次にグローバルフックが呼び出されます。 と書いてありますが、WH_GETMESSAGEでフックしてWM_USERを発生させてみてもMessageProcは1回しか実行されていないようでした。 MessageProcが2回実行されるという解釈は間違っていますか?

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>フックタイプがスレッドとグローバルの両方をサポートしている場合、最初にスレッドフックが呼び出され、次にグローバルフックが呼び出されます。 なんかMSDNの日本語訳がおかしいですね。 原文はこうです。 For a specified hook type, thread hooks are called first, then global hooks. ようは、「スレッドフックとグローバルフックを両方指定したら、スレッドフックのほうが先に呼ばれるよってことです。」 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>MessageProcが2回実行されるという解釈は間違っていますか? 間違ってます。 スレッドフックはdwThreadIdを指定してかけるフック、グローバルフックは0を指定してかけるフックのことです。 WH_GETMESSAGEだからとかは関係ありません。

すると、全ての回答が全文表示されます。

関連するQ&A

  • マウスホイールをフックしたい

    かなり突っ込んだ質問かもしれませんが Win32API系の質問です。 マウスホイールをフックするコードを書いています。 フックはDLLが必要なグローバルフックではなく スレッドローカルなフックです。 具体的には 1.SetWindowsHookEx APIでWH_MOUSEタイプをフック 2.MouseProcフックプロシジャーでWM_MOUSEWHELLメッセージはフックできている。 ここまでは良いのですが ホイールの回転方向がわかりません。 MouseProcフックプロシジャーのlParamを MOUSEHOOKSTRUCT構造体へキャストしても dwExtraInfo追加情報には何も入っておらず (オールゼロでした。) 行き詰っています。 試しにフック後に PeekMessageも試みましたがダメでした。 諸事情でグローバルフックは使いたくなくて スレッドローカルなフックで解決したいのですが 良い方法は無いでしょうか? 試しにフックタイプを WH_CALLWNDPROC WH_GETMESSAGE とこれらも試してみましたがNGでした。 なお、WH_JOURNALRECORDフックは ユーザの操作でキャンセルされてしまうので あまり使いたくありません。 経験者の方、アドバイス頂けると助かります。 宜しく御願いします。

  • SetWindowsHookEx(グローバルフック)の質問

    SetWindowsHookExでグローバルフックして メッセージをすりかえる事って可能でしょうか? 例えばWM_KEYDOWNが送られてきたら、それを無視して WM_CLOSEとかえるといった具合に。 試しにWH_CALLWNDPROCで受け取ったメッセージを 書き換えるだけでは無理でした(WindowsXp SP2) MSDNのWH_CALLWNDPROCRETの関数CallWndRetProcの説明で 「このフックプロシージャは、メッセージを調べることはできますが、変更することはできません。」 となっていました。 ということはWH_CALLWNDPROCのCallWndProcでは変更できるのかな?と思った次第です。 何か情報があれば宜しくお願いします。 (2000では不可だけど98だとできるとか?)

  • フックのタイミング

    SetWindowsHookEx(dllインジェクション)を使ってAPIフックを実装するdllを作っています。 そこそこ使えるレベルまで完成したのですが、どうしてもInit時のフックができません。 フック作動中に新しいプロセスが作られると、フックが実行されdllがアタッチされると思いますが、Init以前にアタッチさせることはできるのでしょうか? といってもダイアログのコンストラクタまで見たいわけではなく、WM_INITDIALOG時に呼ばれるAPIが見たいのです。WM_INITDIALOG以前にアタッチさせる方法はあるのでしょうか?

  • グローバルフック?にならない(SetWindowsHookEx:WH_CALLWNDPROC)

    とあるアプリケーションがアクティブウィンドウである場合、 とあるキーを抑制するアプリを作っているのですが、 とあるキーを抑制するのは低レベルキーフック用のDLLを用意して実現しました。 とあるアプリケーションがアクティブウィンドウである場合は、 500msのタイマで監視していたのですが、かっこわるいので ウィンドウイベントをフックしてWM_ACTIVATEあたりを拾って 拾ったときのウィンドウハンドルがとあるアプリケーションのウィンドウか否かで 判断しようかなんて思ったのです。 で、本題です。 SetWindowsHookEx(WH_CALLWNDPROC, &HookProc, g_hInst, NULL); と、実行しているのですが、自分のウィンドウと、IMEとか、 合計3~4種のウィンドウのイベントしか拾えません。 電卓を起動しても電卓のイベントが何も拾えなかったり。 デバッグだからだめなのかと思い、ログファイルに吐かせた結果 こういった状況です。 ロギングしたイベントは特にマスクせずに、コールバックが呼ばれ、 HC_ACTIONであった場合に全て書き出してみました。 そこで質問です。 SetWindowsHookEx(WH_CALLWNDPROC~ では、デスクトップ上の全てのウィンドウのイベントを覗き見できる 訳ではないのでしょうか? それとも、やり方がわるいのでしょうか? 宜しくお願いします。 #SetWindowsHookExの取り扱いについてはMSDN上で確認できる #部分についてはわかっているつもりです。

  • WM_INITDIALOGのフック

    どこにも載っていないため質問させていただきます。 次のようなコードを書いたとき、ダイアログの出現の検知ができるWM_INITDIALOGを検知できないのはなぜでしょうか。 hHookForDialog = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProcForDialog, hDll, 0); LRESULT CALLBACK CallWndRetProcForDialog(int nCode, WPARAM wp, LPARAM lp) { if(nCode < 0) return CallNextHookEx(hHookForDialog, nCode, wp, lp); PCWPRETSTRUCT Wmes = (PCWPRETSTRUCT)lp; if(nCode == HC_ACTION) { if(Wmes->message == WM_INITDIALOG) { PostMessage(hWndToSendMessage, mesDialogCreated, (WPARAM)(Wmes->hwnd), NULL); } } return CallNextHookEx(hHookForDialog, nCode, wp, lp); } フック自体は成功しているようで、条件文を外すとメッセージはたくさん飛んできます。 けれども目的のWM_INITDIALOGは無いようです。 どうすればいいのかご教授お願いします。

  • timeの引数と戻り値

    http://www.microsoft.com/JAPAN/developer/library/vccore/_crt_time.htm 上記サイトで、少しスクロールを下げると、解説のことろで、 引数は NULL でもかまいませんと書かれています。 引数を NULL にして使うのはどういった場合の時ですか?

  • グローバルフック(SetWindowsHookEx)でのEM_REPLACESELの取得について

    はじめまして。 グローバルフック(SetWindowsHookEx)を使って別アプリ(exe)がEDITボックスに出力している 文字列を取得しようとしています。 SPY++で確認すると別アプリではEM_REPLACESELを用いていることがわかりました。 フックするDLLを以下のように作成しメッセージをフックすることはできました。 1. フックのセット   SetWindowsHookEx(WH_CALLWNDPROC, MyHookProc, hInst, dwThreadId);      // hInst はDllMainでアタッチ時に保存したもの      // dwThreadIdは別アプリのスレッドID(以下の方法で取得)      // HWND pWnd = ::FindWindow(NULL, 別アプリのフォームのキャプション) ;      // HWND pEdt = ::FindWindowEx(pWnd,0,"Edit",0);      // DWORD dwThreadId= ::GetWindowThreadProcessId(pEdt, NULL); 2. コールバック   LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)   {    if( EM_REPLACESELの判定 ){      メッセージの保存処理     }     return CallNextHookEx(hMyHook, nCode, wp, lp);   } 上記のコールバックの中で”EM_REPLACESELの判定”をどのようにしたら良いかわからずに困っています。 if分をはずしてファイルにダンプすると何かメッセージが取得できているのは確認できています。 他のサイトを見て、 MSG* pMSG = (MSG*)lp; として、pMSG->lParam を参照してもEM_REPLACESELになっているメッセージがありませんでした。 何か思いつくことがある方、根本的な間違いがあるという方、 アドバイアスをお願いします。

  • マウスフックについて

    Dllにてマウスフックをして、左ボタンが押しあがったらWM_LBUTTONUPされたら メッセージを送信するというものです。 そのときに、マウスの位置はどこにあってもいいのです。 たとえば、自分のウインドウの中で左ボタンを押して、 デスクトップ上などで左ボタンがあがったらメッセージを送信するというようにしたいのですがうまくいきません。 以下がソースです。 よろしくお願いします。 #include <windows.h> #include "MouseHook.h" HINSTANCE hInst; HHOOK hHook; HWND hWnd; BOOL bHook; int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) { hInst = hInstance; return TRUE; } EXPORT int SetMainHWND(HWND hMainWindow) { hWnd = hMainWindow; return 0; } EXPORT BOOL IsHooking() { if (bHook) return TRUE; else return FALSE; } EXPORT int MouseHookSet() { hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc,hInst, NULL); if (hHook == NULL) { return -1; } else { bHook = TRUE; return 0; } } EXPORT int MouseHookEnd() { if (UnhookWindowsHookEx(hHook) != 0) { bHook = FALSE; return 0; } else { return -1; } } EXPORT LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) { MOUSEHOOKSTRUCT *pmh; pmh = (MOUSEHOOKSTRUCT *)lParam; if (wParam == WM_LBUTTONUP) { SendMessage(hWnd,MOUSEHOOK_LBUTTONUP,0,0); } if (wParam == WM_NCLBUTTONUP) { SendMessage(hWnd,MOUSEHOOK_LBUTTONUP,0,0); } return CallNextHookEx(hHook,nCode,wParam,lParam); }

  • MSDNのセットアップ方法(ヘルプが見たいだけなんです。)

    Visual Basic 6.0 Professional Editionです。  ヘルプを見ようとしたら、「MSDNをインストールしてください。」と言われました。   インストール作業を開始すると、「Microsoft Developer Network ディスクの 1 を挿入してください」といわれました。   そ そんなCDもってないんですけど、、、、(汗.)   私 ヘルプを見たいだけなのにぃ~ ヘルプを参照できるようにするには、どうすればよろしいでしょうか。 教えてくださいませ。     okweb 過去ログから「MSDN ライブラリ」のURLはわかったのですが、これだと毎回オンラインにしないといけないです。  http://www.microsoft.com/japan/developer/library/default.asp

  • 「Microsoft Visual Studio97 SP3」を探しています

    「Microsoft Visual Studio97 SP3」を探しています。 http://www.microsoft.com/japan/developer/vstudio/defaultsp3.htm にあったようなのですが、今はページが存在しません。 今、SP3を入手する方法はありますでしょうか?

このQ&Aのポイント
  • ESET Mobaile Securityのインストールについての疑問点があります。
  • スマホとパソコンの製品のバージョンが異なっていますが、問題はありませんか?
  • パソコンの製品のバージョンが異なることに問題はありませんか?
回答を見る

専門家に質問してみよう