• 締切済み

CallNextHookEx( ) == FALSE

fatal_errorの回答

回答No.1

えと、自信あんましありませんが… フックって理論上は何段でもかけられるんじゃないですか? だから、あるフックが、次のフックに制御を渡すのが CallNextHookなわけで、そのままreturnすれば それ以降のフックの処理は行われない、ということだと思います。 示されている例の戻り値が一緒だったってのは 最後のフックはFALSEを返すことが決まっている、 とかなんじゃないかと。 だから自分でFALSEを返せばそこで処理はとまってFALSE、 CallNextHookなら最後のフックでFALSEが返ってFALSE、 ということなんでは? 疑問形ばっかの回答ですいません。

A__
質問者

補足

ありがとうございます。 フックは何段でも仕掛けられるみたいですね。 CallNextHook( ) っていう関数があるし。 AAA.EXE も BBB.EXE も「ぬ」をフックしている場合、 最初に「ぬ」が AAA.EXE に通知されて、それを return FALSE にすると、BBB.EXE には通知が 行かないみたいだけど、「ぬ」をフックしているアプリが 1つしかない場合とか、次の段のフックプロージャが 存在しない場合は、「ぬ」に対しての処理で、 return FALSE と return CallNextHookEx( ) は全く同じ というように感じました。 本当にそうなんですか?

関連するQ&A

  • キーボードフックの使い道

    dll のソースの一部です。 LRESULT CALLBACK MyHookProc(int nCode, WPARAM wParam, LPARAM lParam) {  if ( wParam == 0x31 )処理;  return CallNextHookEx(hHook, nCode, wParam, lParam); } 処理の部分では、MessageBox( ) とか MessageBeep( ) ぐらいしか 使えません。 「ぬ」 のキーが押されたら、メインのウインドウのエディットボックスの 文字を書き替えたりしたいんだけど、キーボードフックのプロージャの 中では、文字列の書き替えをすると、アプリケーションが強制終了します。 メモリマップドファイル、グローバルメモリの書き替えもやってみたけど キーボードフックのプロージャの中からはできませんでした。 dll の中なのに、キーボードフックのプロージャの中では 自分自身を LoadLibrary( ) して、GetProcAddress( ) とかしないと メモリの書き換えとかができないんですか? キーボードフックのプロージャの良い活用法を教えてください。

  • マウスフックについて

    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); }

  • グローバルフックについて

    VC++6.0でグローバルフック用のDLLを作っていて、どうしてもわからないので質問させていただきます。 フックの内容は、ウィンドウが最前面にあるかどうか常に監視したいので、状態が変わるメッセージをフックしています。 フック対象はとあるゲームなんですが、テストのためにメモ帳を対象にテストをしました。 まず、spy++でウィンドウの状態を変化させたときに送られてくるメッセージを調べた結果。 WM_ACTIVATEが送られてくるので、これをフックしてみたのですが、spy++だとバックグラウンドに行った時、フォアグラウンドに行った時、最小化したとき、最小化から復帰したときにWM_ACTIVATEが送られてくるんですが、いざフックしてみると最小化するときと最小化から復帰したときにしかフックが作動しません。 spy++ではWM_SETFOCUSも送られてくるようだったので、そちらも試してみたのですが、まったく反応がありません。 逆に、spy++では検知してくれないWM_SHOWWINDOWではバックグラウンドに行った時、フォアグラウンドに行った時、最小化したとき、最小化から復帰したとき、すべてに反応してくれました。 このWM_SHOWWINDOWをフックしたときのようになれば問題無いのですが、フック対象をメモ帳からとあるゲームにしたときに、バックグラウンドに行った時と最小化したときは反応してくれたものの、フォアグラウンドに行った時と最小化から復帰したときは反応してくれません。 それと、WM_SHOWWINDOWのメッセージをフックした時のwparamの値なんですが、ネットで調べてみると 表示されようとしているとき 1 非表示されようとしているとき 0 となっているはずなのですが、自分のをみてみると常に647で固定されています。 どなたか解決策をご教授お願いします。 LRESULT CALLBACK WndProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode < 0) { return CallNextHookEx(hHook, nCode, wParam, lParam); } else if (nCode == HC_ACTION) { MSG *lmsg; lmsg = (MSG *)lParam; switch (lmsg->message){ case WM_SHOWWINDOW: MessageBox(NULL,"showwindow","info",MB_OK | MB_TOPMOST); return CallNextHookEx(hHook, nCode, wParam, lParam); break; } } return CallNextHookEx(hHook, nCode, wParam, lParam); }

  • なぜhButton1ボタンからのWM_COMMANDはフックできてクライアントエリアのWM_RBUTTONDOWNはフックできないのでしょうか?

    #define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc") #define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc") #define STRCOMMAND TEXT("ボタンが押されました") HWND hButton1; LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam) { CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam; HDC hDC; if(nCode==HC_ACTION) { hDC = GetDC(pcwpRetStruct->hwnd); switch(pcwpRetStruct->message) { case WM_COMMAND: TextOut(hDC, 10, 10, STRCOMMAND, strlen(STRCOMMAND)); break; case WM_RBUTTONDOWN: TextOut(hDC, 10, 10, STRRBUTTON, strlen(STRRBUTTON)); break; } ReleaseDC(pcwpRetStruct->hwnd, hDC); } return CallNextHookEx(NULL, nCode, wParam, lParam); } LRESULT CALLBACK mainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HHOOK hHook; HDC hDC; switch(uMsg) { case WM_DESTROY: UnhookWindowsHookEx(hHook); PostQuitMessage(0); return 0; case WM_CREATE: hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, my_HookProc, NULL, GetCurrentThreadId() ); if(!hHook) MessageBox(NULL, "hooking failed", NULL, MB_OK); hButton1 = CreateWindow( "BUTTON", "hButton1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 40, 100, 20, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL ); return 0; case WM_LBUTTONDOWN: hDC = GetDC(hWnd); TextOut(hDC, 10, 10, STRLBUTTON, strlen(STRLBUTTON)); ReleaseDC(hWnd, hDC); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }

  • VC++&グローバルフックについて質問です

    vc++2008,Windows Vistaの環境でプログラムを作成しています。 以下、aが押されたら、設定したhWndにWM_KEYDOWN,VK_LEFTのメッセージを送るプログラムのつもりで書きました。 http://www.shos.info/develop/cwin/tipswin.html#windows008 を参考にしています。 しかし、dllにしてWinMainで呼び出したのですが動作しません。 エラーも出ないのでなぜ動かないのかがわかりません。 このプログラムをちゃんと動かすにはどうしたらいいでしょうか。 どうかご指摘ください。よろしくお願いします。 //hook.h #ifdef HOOKAPI #else #define HOOKAPI extern "C" __declspec(dllimport) #endif HOOKAPI HINSTANCE _hInstance; HOOKAPI HHOOK _hHook; HOOKAPI HWND _hWnd; HOOKAPI BOOL Set(HWND hWnd); HOOKAPI void Reset(); //hook.cpp #include <windows.h> #define HOOKAPI extern "C" __declspec(dllexport) #include "hook.h" #pragma data_seg(".share") HHOOK _hHook = NULL; HWND _hWnd = NULL; HINSTANCE _hInstance; #pragma data_seg() #pragma comment(linker, "/section:.share,rws") LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { /* ここでは 'A' が押されたら予め設定済みの _hWnd にメッセージを送る */ if (nCode >= 0 && nCode != HC_NOREMOVE && wParam == 'A') { PostMessage(_hWnd, WM_KEYDOWN, VK_LEFT, 0); CallNextHookEx(_hHook, nCode, wParam, lParam); return 1; } return CallNextHookEx(_hHook, nCode, wParam, lParam); } BOOL Set(HWND hWnd) { /* キーのフック */ _hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)HookProc, _hInstance, 0); /* ここで hInstance は DLL のインスタンス ハンドル */ _hWnd = hWnd; return (_hHook != NULL); } void Reset() { if (_hHook != NULL) { UnhookWindowsHookEx(_hHook); _hHook = NULL; } }

  • キィーボードをフックしません、何故ですか???

    パソコンを現在人間が実際に操作中であるか否かを判定しながら進めるアプリを作っています 簡易的にキィーボードを操作していれば操作中と判断します(マウス操作も含めますが話を簡単にするため今はキィーだけとします) グローバルフックでKEY_DOWNをフックする為に以下のDLL(主要部分のみ)を作りました キィーが押されるとMW_KEYDOWN_DLLというメッセージをアプリに送ります EXPORT LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) { CWPSTRUCT *pcwp = (CWPSTRUCT *)lParam; if(pcwp->message == WM_KEYDOWN) { SendMessage(g_hWnd, WM_KEYDOWN_DLL, pcwp->wParam, pcwp->lParam); ←(1) } } return (CallNextHookEx(g_hHook, nCode, wParam, lParam)); } MW_KEYDOWN_DLLメッセージを受けたアプリは操作中フラグを立てます(主要部分のみ) LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_KEYDOWN_DLL: ここで操作中フラグを立てます ←(2)  このフラグは一定時間後にタイマーが倒します break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return (0L); } 実行してみると(1)に来ません、当然(2)のフラグは立ちません WM_KEYDOWNの代わりにWM_CREATE、WM_CLOSEだときちんとフックします WM_CHAR、MW_KEYUPなどのキィーボード系のメッセージだとフックしません なぜでしょうか??? 多分きわめて初歩的な知識の欠如によるものでしょうが分かりません 宜しくご指導願います

  • システムメニューのフック(SDK)

    はじめまして。 開いている全てのウィンドウのシステムメニューに 項目を追加するプログラムを作っているのですが、 例えばSC_TESTというIDの項目を追加して、 そのSC_TESTが押されたという判断はどうすればいいのかわかりません。 WH_CALLWNDPROCフックをしているのですが、 さすがに下のコードではSC_TESTの部分は動きません。 どの項目がクリックされたかまでは調べられないので しょうか? EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp) { CWPSTRUCT *pcwp; char str[256]; if (nCode < 0) { return CallNextHookEx(hHook, nCode, wp, lp); } if (nCode == HC_ACTION) { if (wp == NULL) { pcwp = (CWPSTRUCT *)lp; switch(pcwp->message){ case WM_CLOSE: MessageBox(pcwp->hwnd, "CLOSE", "OK", MB_OK); break; case WM_CREATE: SetExtWindowEx(pcwp->hwnd); break; case SC_TEST: MessageBox(pcwp->hwnd,"AAA","AAA",MB_OK); break; default: break; } } } return CallNextHookEx(hHook, nCode, wp, lp); }

  • windows2000 フックについて

    教えてください。 Ctrl + Esc、Alt + Tab、 Alt + Escを使用不可にしたいと思いフックを使用し作成しています。 それをDLLにして、VBにて呼び出そうとしているのですが、うまくいきません。 まず、はじめにKeyboardProcを作成したのですが、KBDLLHOOKSTRUCTが宣言されていないとでます。 呼び出し関数とかあるのでしょうか? [環境] OS windows2000 VC++6.0 DLL化 [ソース] LRESULT CALLBACK KeyboardProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam) { KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam; //<--ここでエラーがでる。 BOOL bControlKeyDown = 0; if( p_nCode < 0 || p_nCode == HC_NOREMOVE ){ return CallNextHookEx( hHook, p_nCode, p_wParam, p_lParam ); } switch (p_nCode) { case HC_ACTION: { bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1); if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown) return 1; if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN) return 1; if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN) return 1; break; } default: break; } CallNextHookEx( hHook, p_nCode, p_wParam, p_lParam ); return TRUE; } EXPORT long __stdcall HookSet() { hHook = ::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc, NULL, 0 ); return 1; } DLL化やフックについていろいろ調べたのですが、初めてのため、可笑しい個所があるかとは思いますが、すみませんが教えてください。よろしくお願いします。

  • 宣言による処理の重さ

    第161章 キーボード・フック http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm このサイトのLRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)で {   char str[256];   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } と書いてありますが、char str[256];をstatic char str[256];にしたり、 {   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     char str[256];     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } にするとアプリケーションのパフォーマンスはよくなりますか?

  • 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は無いようです。 どうすればいいのかご教授お願いします。