我使用以下代码设置全局钩子:
SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0)
我设置了一个断点,这样当我第一次运行应用程序时,我可以看到调用了MouseProc方法。这有效但在第一次不再被调用之后。是否自动删除了Hook,如何获取此钩子以便钩子自动保留?我正在为windows编写这个应用程序,这是一个C ++ win32项目。
答案 0 :(得分:6)
我有一个断点设置
这足以解释这个问题。调试器当然会中断。这样可以防止将更多鼠标消息传递到具有焦点的窗口。 Windows提示5秒,然后毫不客气地禁用你的钩子,因为它认为你的代码坏了。
超时是可配置的,您可以使用Regedit.exe设置HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout
值。默认情况下不存在,首先添加DWORD值。单位是毫秒。
答案 1 :(得分:3)
首先你需要做:
return CallNextHookEx(_hook, nCode, wParam, lParam);
在你的MouseProc
中,所以应该返回。
其次,无法调试大多数具有挂钩的代码,您的应用程序将崩溃,因为Windows希望您的MouseProc
函数尽快返回并返回。
您的代码也应该包含消息处理代码,例如GetMessage
,TranslateMessage
和DispatchMessage
。