1

我在尝试使用键盘挂钩时遇到问题。我正在尝试做(并且做)的是从任何窗口/焦点,我可以点击运行功能的键(移动鼠标并单击。)

它从前面工作得很好,但是一旦我开始做其他事情,一切都会变得奇怪(即使在关闭问题之后。)

在 Firefox 上,它将具有“当我单击鼠标时选择并突出显示所有位置”;如果我尝试键入,所有数字字符都会出现,好像 shift 按钮已按下并且无法绕过它。如果我单击任务栏上的编译器 (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);
  }
}

谢谢阅读。

4

1 回答 1

6

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

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

按照您目前拥有的方式,您的代码将阻止来自操作系统其余部分的所有“按键”笔划,因此会出现奇怪的行为。

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

于 2013-09-10T19:18:08.520 回答