首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

全局鍵盤鉤子實現多進程按鍵監控

     編輯:VC 教學

技術方案概覽

使用WH_JOURNALRECORD全局鉤子捕獲系統級鍵盤事件,通過DLL注入實現跨進程監控,適用於熱鍵註冊、輸入法開發、自動化測試等場景。

核心實現步驟

1. DLL導出安裝/卸載接口

extern "C" __declspec(dllexport) void __stdcall SetHook(HWND hMainWin, BOOL bInstall);

導出函數供主程序調用,bInstall=TRUE時調用SetWindowsHookEx安裝鉤子,FALSE時調用UnhookWindowsHookEx卸載。

2. 鉤子回調函數處理

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將虛擬鍵碼傳遞給主視窗。

3. 主程序加載DLL並處理消息

// 加載DLL獲取函數指針
hDLL = LoadLibrary(_T("KeyHook.dll"));
SetHook = (SET_HOOK_PROC)GetProcAddress(hDLL, "SetHook");
// 安裝鉤子
SetHook(m_hWnd, TRUE);
// 消息循環中處理自定義消息
ON_MESSAGE(WM_USER_HOOK_MSG, OnHookKeyUp)

關鍵注意事項

  • DLL位數匹配:32位進程需加載32位DLL,64位同理
  • 鉤子超時:系統設置LowLevelHooksTimeout(默認300ms),回調必須快速返回
  • 權限隔離:UAC啟用時,高完整性級進程無法鉤子低完整性級進程
  • 替代方案:現代Windows建議使用WH_KEYBOARD_LL低級鉤子,無需DLL注入

完整項目結構

KeyHook.sln
├── HookDll/          // 鉤子DLL項目
│   ├── HookDll.cpp   // 導出SetHook、HookProc
│   └── HookDll.def   // 模塊定義文件
└── HookApp/          // 主應用項目
    ├── MainDlg.cpp   // 加載DLL、處理WM_USER_HOOK_MSG
    └── Resource.h
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved