【问题标题】:Why isn't WH_MOUSE hook global anymore?为什么 WH_MOUSE 钩子不再是全局的了?
【发布时间】:2010-11-04 03:55:12
【问题描述】:

我在一个监视鼠标手势的 DLL 中有这个全局鼠标挂钩设置。

一切正常,但为 WH_MOUSE_LL 设置了一个钩子,这是一个低级钩子,不​​需要在外部可注入 DLL 中。

一旦我切换到更合适的那个会说 - WH_MOUSE 鼠标钩,一切都崩溃了。一旦我在我的主应用程序(安装钩子的那个)之外单击,钩子就会损坏 - ::UnhookWindowsHookEx 将失败。

我只找到this guy saying at experts exchange

“没办法,至少在Windows XP + SVP2 WH_MOUSE 不会走向全球,你 必须改用 WH_MOUSE_LL。”

我正确设置了钩子:在使用共享数据部分的 DLL 中,从钩子过程发布而不发送消息。

为什么会发生这种变化?为什么没有记录?有人遇到过这个吗?谢谢!

顺便说一句:我已经对流行的StrokeIt 应用程序进行了一些逆向工程,它使用了 WH_GETMESSAGE 和 WH_MOUSE 挂钩的组合,并且仍然适用于 XP/Vista...

【问题讨论】:

  • 对于自动化应用程序,必须在某一点上进行鼠标挂钩。神速;)
  • 使用反斜杠转义星号和下划线等特殊字符。例如,*不是* _italic_。

标签: c winapi mouse hook low-level


【解决方案1】:

对我来说,不再支持全局 WH_MOUSE 钩子对我来说是个新闻,因为我有一些应用程序使用它并且它们继续在 XP、Vista 和 Windows 7 上运行。

你是如何设置钩子的?你应该可以做 SetWindowsHookEx(WH_MOUSE, my_mouse_callback, g_hinstance, NULL)。

我唯一能想到的是回调函数花费的时间太长,在这种情况下,Windows 可能会删除钩子,或者它没有正确调用 CallNextHookEx。

【讨论】:

    【解决方案2】:

    不确定作为评论是否会更好,但这里是: 我相信根据 MSDN WH_MOUSE 是在线程级别或全局支持的。

    正如您自己指出的那样,有很多应用程序在使用它。

    所以我的猜测是您对全局 WH_MOUSE 的具体实现存在需要调试和修复的问题。当您说“钩子已损坏”时,究竟会发生什么?上钩的应用程序会崩溃吗?您能否将调试器附加到您期望鼠标事件来自的应用程序并检查您的钩子中真正崩溃的原因?

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2019-06-11
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      相关资源
      最近更新 更多