【问题标题】:How to correctly use SetWindowsHookEx & CallNextHookEx如何正确使用 SetWindowsHookEx & CallNextHookEx
【发布时间】:2010-09-17 20:38:40
【问题描述】:

我可以正确设置 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/

【问题讨论】:

    标签: windows winapi hook


    【解决方案1】:

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

    According to MSDNCallNextHookEx 的第一个参数在 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
    }
    

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

    【讨论】:

    • 嗯,你可以在那里找到一些东西。我错过了有关在 NT/XP/2003 上忽略“hhk”参数的信息。现在要给它一个小测试。
    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多