我正在创建一个控制台应用程序,我想记录按键(如向上箭头)。我已经创建了一个低级键盘挂钩,它应该捕获任何线程中的所有按键并调用我的回调函数,但它不起作用。当我按下一个键时程序停止了一段时间,但从不调用回调。我检查了文档,但没有找到任何东西。我不知道我是否错误地使用了SetWindowsHookEx()(据我所知它成功创建了钩子)或者我的回调函数是不正确的!我不确定什么是错的!在此先感谢您的帮助。
#include "Windows.h"
#include <iostream>
using namespace std;
HHOOK hookHandle;
LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam);
int _tmain(int argc, _TCHAR* argv[]) {
hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0);
if(hookHandle == NULL) {
cout << "ERROR CREATING HOOK: ";
cout << GetLastError() << endl;
getchar();
return 0;
}
MSG message;
while(GetMessage(&message, NULL, 0, 0) != 0) {
TranslateMessage( &message );
DispatchMessage( &message );
}
cout << "Press any key to quit...";
getchar();
UnhookWindowsHookEx(hookHandle);
return 0;
}
LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) {
cout << "Hello!" << endl;
// Checks whether params contain action about keystroke
if(nCode == HC_ACTION) {
cout << ((KBDLLHOOKSTRUCT *) lParam)->vkCode << endl;
}
return CallNextHookEx(hookHandle, nCode,
wParam, lParam);
}
答案 0 :(得分:2)
你不能阻塞系统调用(getchar),你必须在调用钩子之前运行一个窗口循环并处理消息。
答案 1 :(得分:0)
在Windows XP上,您需要将hInstance
(从WinMain
)作为第三个参数传递给SetWindowsHookEx
。例如:
int WINAPI WinMain
( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow ) {
hookHandle = SetWindowsHookEx ( WH_KEYBOARD_LL, keyHandler, hInstance, 0 );
// ...
答案 2 :(得分:0)
我建议首先使用simle;
// VB:检索应用程序实例 HINSTANCE appInstance = GetModuleHandle(NULL);
然后: hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL,keyHandler,appInstance,0);
// ...,但稍后还有其他错误