C++ 最后挂起一个程序
我目前正在为一个应用程序制作一个插件,因为它不处理WM_mbutdondown消息,所以我决定钩住WNDPROC,但似乎另一个插件也钩住它并处理这个消息(因为应用程序按字母顺序加载插件,所以我可能不会最后一个钩住WNDPROC,导致另一个插件首先处理消息)。这意味着我必须是最后一个钩住WNDPROC的插件才能访问这些消息 那么,有没有可靠的(不依赖字母顺序等)方法将一个过程挂在最后 编辑:通过使用SetWindowLong函数将窗口的DWL_WNDPROC属性更改为address hook过程来完成挂接。然后使用CallWindowProc从挂接过程调用原始的DWL_WNDPROC。很抱歉没有说明这一点 谢谢,C++ 最后挂起一个程序,c++,winapi,hook,C++,Winapi,Hook,我目前正在为一个应用程序制作一个插件,因为它不处理WM_mbutdondown消息,所以我决定钩住WNDPROC,但似乎另一个插件也钩住它并处理这个消息(因为应用程序按字母顺序加载插件,所以我可能不会最后一个钩住WNDPROC,导致另一个插件首先处理消息)。这意味着我必须是最后一个钩住WNDPROC的插件才能访问这些消息 那么,有没有可靠的(不依赖字母顺序等)方法将一个过程挂在最后 编辑:通过使用SetWindowLong函数将窗口的DWL_WNDPROC属性更改为address hook过程来
Tuntuni。好吧,在您安装的window proc回调中,您可以通过
GetWindowLongPtr
调用来检查当前的window proc,如果有人更改了它,您可以使用SetWindowLongPtr
重新安装程序。当然,这是危险的,至少需要保护您的window proc不被重入(通常使用静态计数器)避免无限递归
您还可以尝试使用API函数安装的系统范围的钩子而不是窗口子类化,或者使用钩子而不是
WH\u CALLWNDPROC
。它应该在调用窗口过程之前被调用(在GetMessage
上,甚至在LL钩子的鼠标消息发布上)因此,它应该在调用任何WH_CALLWNDPROC
hook之前发生。据我所知,这不是任何方式,而且从Raymond的一个博客上看,它显然不是这样设置的。@chris,你能给我提供一个到那篇文章的链接吗(或者我误解了你?)?不确定我是否能找到它,但这里有一个。这种技术的通用名称是窗口子类化,而不是与安装系统范围/线程范围钩子的SetWindowsHookEx
函数相关联的钩子。我不确定这是否行得通,因为应用程序在每个钩子之间调用GetMessage和CallWindowProce插件(加载时)。你还有其他方法吗?@Tuntuni没有明白你的意思。如果其他插件使用WH_CALLWNDPROC
hook,你的WH_鼠标
hook总是会在它之前被调用,而不管实际的hook安装顺序。至少根据文档(没有真正尝试过)它应该是这样的。我忘了解释钩子是怎么做的。非常抱歉。我已经编辑了这个问题。谢谢你的回答。我将测试这个方法,看看它是否有效。另外,谢谢你告诉我“这种钩子”的正确术语.啊!现在我明白你想用WH_鼠标说什么了!我还没试过,但听起来好像它会起作用!:)谢谢!