2012-09-09 55 views
0

我目前正在为一个应用程序做一个插件,因为它不处理WM_MBUTTONDOWN消息我决定挂钩WNDPROC,但似乎另一个插件也挂钩它并处理此消息(因为应用程序按字母顺序加载插件,有可能我最后没有挂接WNDPROC,导致另一个插件首先处理消息)。这意味着我必须是最后一个挂钩WNDPROC才能够接收这些消息。挂钩过程最后

那么,有没有任何可靠的(不依赖于字母顺序等)最后挂钩程序的方式?

编辑:挂钩是通过使用SetWindowLong函数更改窗口的DWL_WNDPROC属性到地址挂钩过程完成的。然后使用CallWindowProc从挂钩过程中调用原始的DWL_WNDPROC。对不起,没有明确这一点!

谢谢, Tuntuni。

+0

没有我知道的任何方式,而且它似乎从雷蒙德的一个博客似乎没有设置。 – chris

+0

@chris你能否给我提供该文章的链接(或者我误解了你?)? – Tuntuni

+0

不知道我是否能找到它,但这里有一个关于[他们如何在Win16中工作](http://blogs.msdn.com/b/oldnewthing/archive/2006/08/09/693280.aspx )。 – chris

回答

1

那么,在你安装的窗口proc回调中,你可以通过GetWindowLongPtr来调用当前窗口过程,如果有人改变它,重新安装你的过程SetWindowLongPtr。当然,这是危险的,至少需要你的窗口过程被保护以避免再次入侵(通常使用静态计数器)以避免无限递归。

此外,您可以尝试使用由SetWindowsHookEx API函数安装的系统范围的钩子而不是窗口子类别 - WH_MOUSEWH_MOUSE_LL钩子而不是WH_CALLWNDPROC。它应在调用窗口过程之前调用(在GetMessage上,或者甚至在LL钩子的鼠标消息发布上),因此它应在调用任何WH_CALLWNDPROC钩子之前发生。

+0

我不确定这会工作,因为应用程序在每个插件之间调用GetMessage和CallWindowProc(当它加载它们时)。还有其他方法可以想到吗? – Tuntuni

+0

@Tuntuni没有明白你的观点。如果其他插件使用'WH_CALLWNDPROC'钩子,那么'WH_MOUSE'钩子总是会被调用BEFORE,忽略实际的钩子安装顺序。至少它应该根据文件(没有真正尝试过)。 – Rost

+0

我忘了解释钩子是如何完成的。我非常抱歉。我编辑了这个问题。 – Tuntuni