Win32 API キーストロークメッセージをフックする

キーストロークメッセージをフックをするためには、SetWindowsHookEx関数を使う。


SetWindowsHookExのプロトタイプ

HHOOK SetWindowsHookEx(
  int idHook,        // フックタイプ
  HOOKPROC lpfn,     // フックプロシージャ
  HINSTANCE hMod,    // アプリケーションインスタンスのハンドル
  DWORD dwThreadId   // スレッドの識別子
);


第二引数のフックプロシージャには、キーストロークに対して処理を行うためのコールバック関数を指定する。このフックプロシージャの定義は以下の通り。

LRESULT CALLBACK KeyboardProc(
  int code,       // フックコード
  WPARAM wParam,  // 仮想キーコード
  LPARAM lParam   // キーストロークメッセージの情報
);

第一引数のcodeは、フックコードであり、この値がHC_ACTIONの場合は、wParamとlParamにキーストローク情報を保持していることになる。



フックでキーストロークを無効にする例


DLL側ソースコード(KeyHook.dll)

  • KeyHook.h
  • #ifdef KEYHOOK_EXPORTS
    #define KEYHOOK_API __declspec(dllexport)
    #else
    #define KEYHOOK_API __declspec(dllimport)
    #endif
    
    #include <windows.h>
    
    KEYHOOK_API LRESULT CALLBACK HookProc(int, WPARAM, LPARAM);
    KEYHOOK_API BOOL StartHook();
    KEYHOOK_API BOOL EndHook();


  • KeyHook.cpp
  • #include "KeyHook.h"
    
    #include <windows.h>
    
    #pragma data_seg("Shared")
    HHOOK g_hHook = NULL;
    #pragma data_seg()
    #pragma comment(linker, "/Section:Shared,rws")
    
    HINSTANCE g_hInst;
    
    
    //キーフックプロシージャ
    //
    //引数
    //nCode: フックコード
    //wParam: 仮想キーコード
    //lParam: キーストロークメッセージ
    KEYHOOK_API LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        if (nCode == HC_ACTION) {
            
            //正数を返すと、キーボードが無効になる
            return 1;
    
        }
        return CallNextHookEx(g_hHook, nCode, wParam, lParam);
    }
    
    KEYHOOK_API BOOL StartHook() 
    {
        g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)HookProc, g_hInst, 0);
        return g_hHook != NULL;
    }
    
    KEYHOOK_API BOOL EndHook()
    {
        return UnhookWindowsHookEx(g_hHook);
    }
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved)
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    		g_hInst = (HINSTANCE)hModule;
            break;
    	}
    	return TRUE;
    }



    フック用DLLを使用するEXEのソースコード(KeyHookTest.cpp)

    #include <windows.h>
    #include "KeyHook.h"
    #pragma comment(lib, "KeyHook.lib")
    
    int main()
    {
        //フック開始
        StartHook();
    
        //5秒間 キーストロークが無効になる
        Sleep(5000);
    
        //フック終了
        EndHook();
    
        return 0;
    }





    参考
    http://msdn.microsoft.com/ja-jp/library/cc430103.aspx
    http://msdn.microsoft.com/ja-jp/library/cc429591.aspx