我可以正确设置一个Windows挂钩,但是我对MSDN中的行“混淆”说“调用CallNextHookEx函数链接到下一个挂钩过程是可选的,但强烈建议;否则,已安装挂钩的其他应用程序将不会收到挂钩通知,因此可能会出现错误行为。你应该调用CallNextHookEx,除非你绝对需要阻止其他应用程序看到通知。“。

我想成为一名优秀的编程公民,并打电话给下一个钩子。但是,我的钩子程序看起来像这样:

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(...);
        ...
}

那么,如果代码不是我感兴趣的代码,那么钩子程序会发生什么?如何调用下一个钩子?

编辑:主要问题是从SetWindowsHookEx返回HHOOK,需要将其传递给CallNextHookEx函数。

更新:在NT平台上似乎忽略了hook参数:
http://msdn.microsoft.com/en-us/library/ms644974.aspx 结果 http://www.klenotic.com/pl/null_hhook/

有帮助吗?

解决方案

根据文档,正确的做法是将您收到的参数直接传递给CallNextHookEx,就像您收到它们一样。无论您是否决定处理挂钩消息,都应该调用CallNextHookEx。

根据MSDN CallNextHookEx的第一个参数在NT / XP / 2003上被忽略,对于较旧的基于Win95的操作系统,它应该是您使用 SetWindowsHookEx 注册钩子时收到的 HHOOK 。文档没有为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
}

这确保您在处理结束时始终调用挂钩,并且很难意外添加将绕过 CallNextHookEx return

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top