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 中的断点处冻结的主要内容,如果未能解决你的问题,请参考以下文章

在两个线程中设置两个鼠标钩子

获取IE页面窗口的问题

为 WH_MOUSE 设置 WindowsHookEx

SetWindowsHookEx - 防病毒问题

SetWindowsHookEx 问题的文档

为啥必须将 SetWindowsHookEx 与 Windows 消息队列一起使用