C ++调用SetWindowsHookEx WH_KEYBOARD_LL正确的设置
-
24-09-2019 - |
题
我创建一个控制台应用程序中,我想记录按键(如向上箭头)。我创建了应该捕获所有按键在任何线程和调用我的回调函数低级别的键盘挂钩,但它不工作。该方案摊位一点时,我打一个关键,但绝不会调用回调。我检查的文件,但没有发现任何东西。我不知道我是否使用调用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);
}
解决方案
您不能在系统调用(中的getchar),你必须要运行一个窗口,循环和处理消息钩子之前调用阻塞。
其他提示
在Windows XP中,你需要,你需要通过hInstance
(从WinMain
)作为第三个参数SetWindowsHookEx
。例如:
int WINAPI WinMain
( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow ) {
hookHandle = SetWindowsHookEx ( WH_KEYBOARD_LL, keyHandler, hInstance, 0 );
// ...
我建议笑着第一;
// VB:检索应用实例 HINSTANCE appInstance =的GetModuleHandle(NULL);
和然后: hookHandle = SetWindowsHookEx函数(WH_KEYBOARD_LL,keyHandler,appInstance,0);
// ...,但也有另一种错误后,也
不隶属于 StackOverflow