SetWindowsHookEx WH_MOUSE 在 Win7 中的断点处冻结
Posted
技术标签:
【中文标题】SetWindowsHookEx WH_MOUSE 在 Win7 中的断点处冻结【英文标题】:SetWindowsHookEx WH_MOUSE freeze on breakpoint in Win7 【发布时间】:2010-08-12 17:41:07 【问题描述】:赫洛斯,
在 WinXP 上,我的应用程序已成功使用全局鼠标钩来检索鼠标位置和点击,即使它没有焦点。钩子在一个单独的 .dll 中,并且正在像这样初始化(在 delphi 中):
SetWindowsHookEx(WH_MOUSE, @MouseHookCB, HInstance , 0);
现在在 Win7 上,这基本上也可以在运行时工作,但我不能再很好地调试我的应用程序(我可以在 XP 下)。一旦我遇到断点,Win7 就会完全冻结。我无法切换到另一个进程(即使任务管理器无法打开)。如果我很幸运,我可以在 IDE 中停止我的进程。大多数时候,虽然我必须重新启动/注销才能重新获得访问权限。
我知道问题与鼠标钩有关,因为如果我不使用鼠标钩,它就不存在。 即使我的钩子程序只执行以下操作,也是如此:
CallNextHookEx(MouseHook, Code, wParam, lParam);
即。只是钩子的存在引起了麻烦。
让 globalhooks.dll 向 EventLog 中写入一些内容,我发现它仍然处于活动状态,即使我处于断点状态。
我尝试通过 WH_MOUSE_LL 使用低级鼠标钩子,它基本上可以工作,但在安装钩子时给我奇怪的鼠标移动延迟,有时在调整窗口大小时。遇到断点时还会冻结几秒钟,但至少系统会在大约 5 秒后恢复……因此,这个选项更糟糕,因为它也会影响运行时。
知道为什么 WH_MOUSE 钩子首先会在调试期间冻结我的应用程序吗?
【问题讨论】:
【参考方案1】:如果你正在调试一个应用程序,你不应该使用 HInstance。 您正在将 .exe 本身注入到全局进程中,调试时您会停止所有鼠标处理,这可以解释您的问题。
SetWindowsHookEx 文档声明在连接到自己的进程时传递 0,并在连接到远程或全局进程时处理到 DLL。
还要确保 MouseHookCB() 正在返回 CallNextHookEx 的值。
【讨论】:
以上是关于SetWindowsHookEx WH_MOUSE 在 Win7 中的断点处冻结的主要内容,如果未能解决你的问题,请参考以下文章