3

赫洛斯,

在 WinXP 上,我的应用程序已成功使用全局鼠标钩来检索鼠标位置和点击,即使它没有焦点。钩子在一个单独的 .dll 中,并且正在像这样初始化(在 delphi 中):

SetWindowsHookEx(WH_MOUSE, @MouseHookCB, HInstance , 0);

现在在 Win7 上,这基本上也可以在运行时工作,但我不能再很好地调试我的应用程序(我可以在 XP 下)。一旦我遇到断点,Win7 就会完全冻结。我无法切换到另一个进程(即使任务管理器无法打开)。如果我很幸运,我可以在 IDE 中停止我的进程。大多数时候,虽然我必须重新启动/注销才能重新获得访问权限。

我知道问题与鼠标钩有关,因为如果我不使用鼠标钩,它就不存在。即使我的钩子程序只执行以下操作,这也是如此:

CallNextHookEx(MouseHook, Code, wParam, lParam);

IE。只是钩子的存在引起了麻烦。

让 globalhooks.dll 向 EventLog 中写入一些内容,我发现它仍然处于活动状态,即使我在断点上也是如此。

我尝试通过 WH_MOUSE_LL 使用低级鼠标钩子,它基本上可以工作,但在安装钩子时给我奇怪的鼠标移动延迟,有时在调整窗口大小时。遇到断点时也会冻结几秒钟,但至少系统会在大约 5 秒后恢复……因此,这个选项更糟糕,因为它也会影响运行时。

知道为什么 WH_MOUSE 钩子首先会在调试期间冻结我的应用程序吗?

4

1 回答 1

1

如果您正在调试应用程序,则不应使用 HInstance。您正在将 .exe 本身注入到全局进程中,在调试时您正在停止所有可以解释您的问题的鼠标处理。

SetWindowsHookEx 文档声明在连接到自己的进程时传递 0,并在连接到远程或全局进程时处理 DLL。

还要确保 MouseHookCB() 正在返回 CallNextHookEx 的值。

于 2011-01-19T00:07:14.183 回答