我在一个监视鼠标手势的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上运行......
答案 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的具体实现有一个需要调试和修复的问题。当你说“钩子被破坏”时,到底发生了什么?钩住的应用程序崩溃了吗?您是否可以将调试器附加到您希望鼠标事件发生的应用程序,并检查钩子中真正崩溃的内容?