我可以正确设置一个 Windows 钩子(Hook),但我对 MSDN 中的一行感到困惑:“调用 CallNextHookEx 函数以链接到下一个钩子(Hook)过程是可选的,但强烈建议这样做;否则,其他安装了钩子(Hook)的应用程序将不接收 Hook 通知,因此可能会出现不正确的行为。除非您绝对需要防止其他应用程序看到通知,否则您应该调用 CallNextHookEx。”。
我想成为一名优秀的编程公民并调用下一个钩子(Hook)。但是,我的钩子(Hook)程序如下所示:
LRESULT CALLBACK CBTProc(int code, WPARAM wp, LPARAM lp)
{
if (code != HCBT_CREATEWND)
{
// What do I do here? It's not the event I requested so how do I pass it on?
return 0;
}
// It's the code we want (create window)
CallNextHookEx(...);
...
}
那么,如果代码不是我感兴趣的代码,在钩子(Hook)过程中会发生什么?我如何调用下一个钩子(Hook)?
编辑: 主要问题是从 SetWindowsHookEx 返回 HHOOK,需要将其传递给 CallNextHookEx 函数。
更新: 似乎在 NT 平台上忽略了钩子(Hook)参数:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/
最佳答案
根据文档,正确的做法是将您收到的参数直接传递给 CallNextHookEx,就像您收到的一样。无论您是否决定处理钩子(Hook)消息,您还应该调用 CallNextHookEx。
According to MSDN ,CallNextHookEx
的第一个参数在 NT/XP/2003 上被忽略,对于旧的基于 Win95 的操作系统,它应该是 HHOOK
当你注册你的钩子(Hook)时收到的 0x25181131310341310文档没有指定 Windows 2000 的值,但由于它是 NT 系列的一部分,合理的猜测是它在那里也被忽略了。
鉴于所有这些,为 NT 系列操作系统编写方法的一种好方法可能是这样的:
LRESULT CALLBACK CBTProc( int code, WPARAM wp, LPARAM lp )
{
if( code == HCBT_CREATEWND )
ProcessCreateWnd( wp, lp );
return CallNextHookEx( 0, code, wp, lp );
}
void ProcessCreateWnd( WPARAM wp, LPARAM lp )
{
// my code here
}
这确保您总是在处理结束时调用钩子(Hook),并且很难意外添加一个
SetWindowsHookEx
绕过 return
。关于windows - 如何正确使用 SetWindowsHookEx & CallNextHookEx,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/214022/