Eva*_*ake 1 c++ winapi keyboard-hook
我在尝试使用键盘钩时遇到问题.我想做的(并且确实)是从任何窗口/焦点,我可以点击一个运行一个功能的键(移动鼠标和点击.)
它从前面工作得很好,但是一旦我开始做其他事情,一切都很奇怪(即使在关闭问题之后.)
在Firefox上,它会有一个"选择并突出显示鼠标点击时所有位置"; 如果我尝试输入,所有数字字符都会出现,就好像换档按钮已关闭而无法绕过它.如果我点击任务栏上的编译器(wxDev C++),它会自动启动程序的新实例.
这只是问题的开始,我重新启动计算机以再次获得正常行为.
我想我可能错了:
在int WinMain中:
keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hThisInstance, 0);
在主程序中:
case WM_KEY_WPARAM_VK:
keyid = wParam; // 65 == 'a'
letterid = keyid - 65;
if ('a'+letterid == 'q') { DoFunction(); }
return 0;
Run Code Online (Sandbox Code Playgroud)
所以当我在键盘上按q时,会调用该函数.
这是程序,我试图不锁定键盘键入(所以我添加了额外的行.)我无法弄明白...
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam ) {
KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
// When a key is pressed
if (WM_KEYDOWN == wParam) {
PostMessage(hWnd, WM_KEY_WPARAM_VK, pKeyBoard->vkCode, 0);
CallNextHookEx(keyboardHook, pKeyBoard->vkCode, 0, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢阅读.
你需要将CallNextHookEx
函数放在if
语句之外!(和更新,以正确传递wParam
和lParam
下一钩)
return CallNextHookEx(keyboardHook, pKeyBoard->vkCode, wParam, lParam);
Run Code Online (Sandbox Code Playgroud)
你现在拥有它的方式,你的代码将阻止来自操作系统其余部分的所有"关键"笔划,因此是奇怪的行为.
CallNextHookEx
无论你在钩子里做什么,都必须调用它.我也会避免在你的钩子内进行任何冗长的(阻塞)操作.