#include <iostream>
#include <fstream>
#include <windows.h>
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
KBDLLHOOKSTRUCT* pKeyboardStruct = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
static bool isPressed[256] = { false };
static ULONGLONG lastPressTime[256] = { 0 };
std::ofstream outputFile("keyboard_log.txt", std::ios_base::app);
if (nCode == HC_ACTION) {
switch (wParam) {
case WM_KEYDOWN:
if (!isPressed[pKeyboardStruct->vkCode]) {
isPressed[pKeyboardStruct->vkCode] = true;
lastPressTime[pKeyboardStruct->vkCode] = GetTickCount64();
std::cout << lastPressTime[pKeyboardStruct->vkCode] <<" " << (char)pKeyboardStruct->vkCode << " 按下" << std::endl;
outputFile << lastPressTime[pKeyboardStruct->vkCode] << " " << (char)pKeyboardStruct->vkCode << " 按下" << std::endl;
}
break;
case WM_KEYUP:
if (isPressed[pKeyboardStruct->vkCode]) {
isPressed[pKeyboardStruct->vkCode] = false;
ULONGLONG ls = GetTickCount64();
ULONGLONG pressDuration = ls - lastPressTime[pKeyboardStruct->vkCode];
std::cout << ls<<" "<<(char)pKeyboardStruct->vkCode << " 弹起 " << pressDuration << "ms" << std::endl;
outputFile << ls << " " << (char)pKeyboardStruct->vkCode << " 弹起 " << pressDuration << "ms" << std::endl;
outputFile.close();
}
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main() {
std::ofstream outputFile("keyboard_log.txt", std::ios_base::out | std::ios_base::trunc);
if (!outputFile.is_open()) {
std::cerr << "Failed to open the file for clearing!" << std::endl;
return 1;
}
outputFile.close();
HHOOK hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0);
if (hHook == NULL) {
std::cerr << "Failed to set hook!" << std::endl;
return 1;
}
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hHook);
return 0;
}```