【问题标题】:Win32 C++ Low Level Keyboard Hook causing strange behaviorWin32 C++ 低级键盘挂钩导致奇怪的行为
【发布时间】:2013-09-10 19:10:42
【问题描述】:

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

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

在 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);
  }
}

感谢阅读。

【问题讨论】:

    标签: c++ winapi keyboard-hook


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多