Win32 C ++低级键盘挂钩导致奇怪的行为

时间:2013-09-10 19:10:43

标签: 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;

因此,当我在键盘上按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);
  }
}

感谢阅读。

1 个答案:

答案 0 :(得分:6)

您需要将CallNextHookEx函数放在if语句之外! (并将其更新为正确传递wParamlParam到下一个钩子)

return CallNextHookEx(keyboardHook, pKeyBoard->vkCode, wParam, lParam);

你现在拥有它的方式,你的代码将阻止来自操作系统其余部分的所有“关键”笔划,因此这种奇怪的行为。

无论你在钩子里做什么,都必须调用CallNextHookEx。我也会避免在你的钩子内进行任何冗长的(阻塞)操作。