2009-06-18 69 views
1

我在一个监视鼠标手势的DLL中设置了全局鼠标钩子。WH_MOUSE为什么不是全局钩子?

一切都很完美,但是为WH_MOUSE_LL设置了一个钩子,它是一个低级钩子,不​​需要在外部注入DLL中。

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

我只找到this guy saying at experts exchange: “没办法,至少是Windows XP下的+ SVP2 WH_MOUSE不会走出去,你 必须使用WH_MOUSE_LL代替”

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

这为什么改变了?为什么没有记录?任何人遇到这个?谢谢!

BTW:我已经反向工程了一下流行StrokeIt应用程序,它使用WH_GETMESSAGE和WH_MOUSE挂钩的组合,仍然适用于XP/Vista的...

+0

必须在自动化应用程序的某个位置进行鼠标挂钩。 Godspeed;) – 2009-06-18 21:55:55

回答

0

它的新闻,我认为全球WH_MOUSE钩不再支持,因为我有几个应用程序使用它,他们继续在XP,Vista和Windows 7上工作。

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

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

0

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

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

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