键盘捕获代码:
#include <iostream>
#include <windows.h>
// 键盘钩子回调函数
LRESULT CALLBACK KeyboardHookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT* pKeyboardStruct = (KBDLLHOOKSTRUCT*)lParam;
// 检测按下或释放事件
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
{
// 获取按键码和扫描码
DWORD vkCode = pKeyboardStruct->vkCode;
DWORD scanCode = pKeyboardStruct->scanCode;
// 打印按下的按键信息
std::cout << "Key down - VK code: " << vkCode << ", Scan code: " << scanCode << std::endl;
// 如果是拦截,可加上如下代码
// return true;
}
else if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)
{
// 获取按键码和扫描码
DWORD vkCode = pKeyboardStruct->vkCode;
DWORD scanCode = pKeyboardStruct->scanCode;
// 打印释放的按键信息
std::cout << "Key up - VK code: " << vkCode << ", Scan code: " << scanCode << std::endl;
// 如果是拦截,可加上如下代码
// return true;
}
}
// 将事件传递给下一个钩子或默认过程
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main()
{
// 安装全局键盘钩子
HHOOK hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookCallback, NULL, 0);
if (hKeyboardHook == NULL)
{
std::cerr << "Failed to install keyboard hook!" << std::endl;
return -1;
}
// 消息循环,等待键盘事件
MSG message;
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
// 卸载键盘钩子
UnhookWindowsHookEx(hKeyboardHook);
return 0;
}
如果是键盘拦截,需要将KeyboardHookCallback函数事件进行处理,接收消息以后直接返回,而不是将事件传递给下一个钩子或默认过程。
如果是仅仅拦截某个进程键盘事件,只需要修改SetWindowsHookEx第3、4个参数即可。