Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 最后挂起一个程序_C++_Winapi_Hook - Fatal编程技术网

C++ 最后挂起一个程序

C++ 最后挂起一个程序,c++,winapi,hook,C++,Winapi,Hook,我目前正在为一个应用程序制作一个插件,因为它不处理WM_mbutdondown消息,所以我决定钩住WNDPROC,但似乎另一个插件也钩住它并处理这个消息(因为应用程序按字母顺序加载插件,所以我可能不会最后一个钩住WNDPROC,导致另一个插件首先处理消息)。这意味着我必须是最后一个钩住WNDPROC的插件才能访问这些消息 那么,有没有可靠的(不依赖字母顺序等)方法将一个过程挂在最后 编辑:通过使用SetWindowLong函数将窗口的DWL_WNDPROC属性更改为address hook过程来

我目前正在为一个应用程序制作一个插件,因为它不处理WM_mbutdondown消息,所以我决定钩住WNDPROC,但似乎另一个插件也钩住它并处理这个消息(因为应用程序按字母顺序加载插件,所以我可能不会最后一个钩住WNDPROC,导致另一个插件首先处理消息)。这意味着我必须是最后一个钩住WNDPROC的插件才能访问这些消息

那么,有没有可靠的(不依赖字母顺序等)方法将一个过程挂在最后

编辑:通过使用SetWindowLong函数将窗口的DWL_WNDPROC属性更改为address hook过程来完成挂接。然后使用CallWindowProc从挂接过程调用原始的DWL_WNDPROC。很抱歉没有说明这一点

谢谢,
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_鼠标说什么了!我还没试过,但听起来好像它会起作用!:)谢谢!