我在使用键盘钩子时遇到了问题。我要做的(并且做的)是从任何窗口/焦点,我可以点击一个键,运行一个函数(移动鼠标和点击)。
从正面看,它运行得很好,但当我开始做其他事情时,一切都很奇怪(即使是在结束问题之后)。
在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);
}
}感谢您的阅读。
发布于 2013-09-10 19:18:08
您需要将CallNextHookEx函数放在if语句之外!(并更新它以正确地将wParam和lParam传递到下一个钩子)
return CallNextHookEx(keyboardHook, pKeyBoard->vkCode, wParam, lParam);按照您当前的方式,您的代码将阻止操作系统其他部分的所有“键”笔画,因此出现了奇怪的行为。
无论您在钩子中做什么,调用CallNextHookEx都是绝对必要的。我还将避免在钩子中执行任何冗长的(阻塞)操作。
https://stackoverflow.com/questions/18727014
复制相似问题