海洛斯,
在WinXP上,我的应用程序已成功使用全局鼠标钩来检索鼠标位置和点击,即使它没有焦点。钩子在一个单独的.dll中,并且正在这样初始化(在delphi中):
SetWindowsHookEx(WH_MOUSE, @MouseHookCB, HInstance , 0);
现在在Win7上这基本上也可以在运行时运行,但我不能再很好地调试我的应用程序(我可以在XP下)。一旦我遇到断点,Win7就完全冻结了。我无法切换到另一个进程(即使taskmanager无法打开)。如果我很幸运,我可以在IDE中停止我的进程。大多数时候,我必须重新启动/注销才能重新获得访问权限。
我知道问题与鼠标挂钩有关,因为如果我不使用挂钩,它就不存在了。 即使我的hookprocedure除了以下内容之外什么都不做:
CallNextHookEx(MouseHook, Code, wParam, lParam);
即。只是钩子的存在导致了麻烦。
让globalhooks.dll在EventLog中写入内容我发现即使在断点时它仍处于活动状态。
我试图通过WH_MOUSE_LL使用lowlevelmouse钩子,它基本上可以工作,但在安装钩子时有时给我奇怪的鼠标移动延迟,有时在调整窗口大小时。在点击断点时也有一段时间冻结,但至少系统会在~5秒后恢复...因此这个选项更糟糕,因为它也会影响运行时间。
任何想法为什么WH_MOUSE钩子在调试期间冻结我的应用程序?
答案 0 :(得分:1)
如果您正在调试APP,则不应使用HInstance。 您正在将.exe本身注入到全局进程中,在调试时您将暂停所有可以解释您的问题的鼠标处理。
SetWindowsHookEx文档声明在囤积到自己的进程时传递0并在囤积到远程或全局进程时处理DLL。
还要确保MouseHookCB()正在重新调整CallNextHookEx的值。