最后一个程序

时间:2012-09-09 20:50:45

标签: c++ winapi hook

我目前正在为一个应用程序创建一个插件,因为它不处理WM_MBUTTONDOWN消息,我决定挂钩WNDPROC,但似乎另一个插件也挂钩它并处理此消息(因为应用程序加载了插件)按字母顺序排列,我可能不会最后挂钩WNDPROC,导致其他插件首先处理消息。这意味着我必须成为最后一个挂钩WNDPROC以便能够获取这些消息的人。

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

编辑:通过使用SetWindowLong函数将窗口的DWL_WNDPROC属性更改为地址挂钩过程来完成挂钩。然后使用CallWindowProc从钩子过程调用原始DWL_WNDPROC。很抱歉没有说清楚!

谢谢, Tuntuni。

1 个答案:

答案 0 :(得分:1)

好吧,在您安装的窗口proc回调中,您可以通过GetWindowLongPtr调用检查当前窗口proc,如果有人更改了,请用SetWindowLongPtr重新安装proc。当然,这很危险,至少会要求保护窗口proc不受重入(通常使用静态计数器)以避免无限递归。

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