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)
#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();
#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