0

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

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

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

谢谢,通图尼。

4

1 回答 1

1

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

您也可以尝试使用由SetWindowsHookExAPI 函数安装的系统范围的钩子而不是窗口子类化 -WH_MOUSEWH_MOUSE_LL钩子而不是WH_CALLWNDPROC. 它应该在窗口过程被调用之前被调用(在GetMessageLL 钩子上甚至在鼠标消息发布时),因此它应该在WH_CALLWNDPROC调用任何钩子之前发生。

于 2012-09-09T21:09:27.300 回答