使用WH_JOURNALRECORD全局鉤子捕獲系統級鍵盤事件,通過DLL注入實現跨進程監控,適用於熱鍵註冊、輸入法開發、自動化測試等場景。
extern "C" __declspec(dllexport) void __stdcall SetHook(HWND hMainWin, BOOL bInstall);
導出函數供主程序調用,bInstall=TRUE時調用SetWindowsHookEx安裝鉤子,FALSE時調用UnhookWindowsHookEx卸載。
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
EVENTMSG* msg = (EVENTMSG*)lParam;
if (msg->message == WM_KEYUP) {
PostMessage(hWndMain, WM_USER_HOOK_MSG, (WPARAM)msg->paramL, 0);
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
僅處理WM_KEYUP避免重複觸發,通過PostMessage將虛擬鍵碼傳遞給主視窗。
// 加載DLL獲取函數指針
hDLL = LoadLibrary(_T("KeyHook.dll"));
SetHook = (SET_HOOK_PROC)GetProcAddress(hDLL, "SetHook");
// 安裝鉤子
SetHook(m_hWnd, TRUE);
// 消息循環中處理自定義消息
ON_MESSAGE(WM_USER_HOOK_MSG, OnHookKeyUp)
LowLevelHooksTimeout(默認300ms),回調必須快速返回WH_KEYBOARD_LL低級鉤子,無需DLL注入KeyHook.sln
├── HookDll/ // 鉤子DLL項目
│ ├── HookDll.cpp // 導出SetHook、HookProc
│ └── HookDll.def // 模塊定義文件
└── HookApp/ // 主應用項目
├── MainDlg.cpp // 加載DLL、處理WM_USER_HOOK_MSG
└── Resource.h