gpt4 book ai didi

c++ - Win32 C++ 低级键盘钩子(Hook)导致奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 00:52:36 24 4
gpt4 key购买 nike

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

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

在 firefox 上,它会有一个“选择并突出显示所有鼠标所在的位置”;如果我尝试打字,所有数字字符都会出现,就好像 shift 按钮已按下且无法绕过它一样。如果我在任务栏上单击我的编译器 (wxDev C++),它会自动启动程序的一个新实例。

这只是问题的开始,我重新启动计算机以恢复正常行为。

我想我可能用错了:

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

感谢阅读。

最佳答案

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

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

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

无论您在 Hook 中做什么,调用CallNextHookEx 都是绝对必要的。我还会避免在 Hook 内执行任何冗长的(阻塞的)操作。

关于c++ - Win32 C++ 低级键盘钩子(Hook)导致奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18727014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com