C++ SetWindowshookx WH_MOUSE_LL hooke只需移动一次鼠标
我正在使用以下代码设置全局钩子:C++ SetWindowshookx WH_MOUSE_LL hooke只需移动一次鼠标,c++,windows,mouse,hook,C++,Windows,Mouse,Hook,我正在使用以下代码设置全局钩子: SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0) 我设置了一个断点,以便在第一次运行应用程序时可以看到调用了MouseProc方法。这是可行的,但在第一次之后,它不再被称为。钩子是自动移除的吗?我如何获得它以使钩子自动保持?我正在编写Windows的应用程序,这是一个C++ Win32项目。首先需要做的是: return CallNextHookEx(_hook, nCode, wParam, lParam);
SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0)
我设置了一个断点,以便在第一次运行应用程序时可以看到调用了MouseProc方法。这是可行的,但在第一次之后,它不再被称为。钩子是自动移除的吗?我如何获得它以使钩子自动保持?我正在编写Windows的应用程序,这是一个C++ Win32项目。首先需要做的是:
return CallNextHookEx(_hook, nCode, wParam, lParam);
在您的MouseProc
中,因此它应该返回
其次,不可能调试大多数有钩子的代码,你的应用程序会崩溃,因为windows希望你的MouseProc
函数尽快返回。
您的代码还应该具有消息处理代码,如GetMessage
、TranslateMessage
和DispatchMessage
示例代码:
我设置了一个断点
这足以解释这个问题。调试器当然会中断。这将阻止进一步的鼠标消息传递到具有焦点的窗口。Windows忍受了5秒钟,然后不客气地禁用了你的钩子,因为它认为你的代码被破坏了
超时是可配置的,您可以使用Regedit.exe设置
HKEY\u CURRENT\u USER\Control Panel\Desktop\LowLevelHooksTimeout
值。默认情况下不存在,请先添加DWORD值。单位为毫秒。请发布MouseProc的代码。您需要传递有效的模块句柄。您可能想说GetModuleHandle(NULL)
。谢谢您的回答,但我发现断点实际上是导致问题的原因。当你设置断点时,这个钩子似乎被卸载了,在我设置断点之前,它工作得很好。是的,请注意这个答案。我在你发帖子之前就知道了。谢谢你继续解释为什么会这样,我真的很感谢你的帮助。