WH_MOUSE为什么不再挂钩全局?

时间:2009-06-18 21:51:08

标签: c winapi mouse hook low-level

我在一个监视鼠标手势的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上运行......

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

所以我的猜测是你的全局WH_MOUSE的具体实现有一个需要调试和修复的问题。当你说“钩子被破坏”时,到底发生了什么?钩住的应用程序崩溃了吗?您是否可以将调试器附加到您希望鼠标事件发生的应用程序,并检查钩子中真正崩溃的内容?