如何正确使用SetWindowsHookEx&呼叫下一个挂钩 [英] How to correctly use SetWindowsHookEx & CallNextHookEx

查看:93
本文介绍了如何正确使用SetWindowsHookEx&呼叫下一个挂钩的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以正确设置Windows钩子,但是我对MSDN中的一行感到困惑,该行说:调用CallNextHookEx函数链接到下一个钩子过程是可选的,但是强烈建议;否则,其他具有已安装的钩子将不会接收到钩子通知,因此可能会出现不正确的行为.除非绝对需要防止其他应用程序看到该通知,否则应调用CallNextHookEx.".

I can correctly setup up a windows hook, but I get confused by the line in MSDN that says "Calling the CallNextHookEx function to chain to the next hook procedure is optional, but it is highly recommended; otherwise, other applications that have installed hooks will not receive hook notifications and may behave incorrectly as a result. You should call CallNextHookEx unless you absolutely need to prevent the notification from being seen by other applications.".

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

I want to be a good programming citizen and call the next hook. But, my hook procedure looks like this:

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

那么,如果代码不是我感兴趣的代码,在挂接过程中会发生什么?我怎么称呼下一个钩子?

So, what happens in the hook procedure if the code isn't the one I'm interested in? How do I call the next hook?

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

The main problem is that a HHOOK is returned from the SetWindowsHookEx, and that needs to be passed to the CallNextHookEx function.

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

Update: It seems the hook parameter is ignored on the NT platforms:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

推荐答案

根据文档,正确的做法是将收到的参数直接传递给CallNextHookEx,与收到的参数完全一样.无论是否决定处理该挂接消息,您都应该致电CallNextHookEx.

According to the docs, the proper thing to do is pass the arguments you received directly to CallNextHookEx, exactly as you received them. You should also call CallNextHookEx regardless of whether you decided to handle the hook message.

根据MSDN CallNextHookEx的第一个参数是在NT/XP/2003上被忽略,对于较早的基于Win95的操作系统,它应该是在SetWindowsHookEx中注册钩子时收到的HHOOK.这些文档没有为Windows 2000指定值,但是由于它是NT家族的一部分,因此可以合理地猜测它在那里也被忽略了.

According to MSDN, the first parameter to CallNextHookEx is ignored on on NT/XP/2003, and for older Win95-based operating systems it should be the HHOOK you received when you registered your hook with SetWindowsHookEx. The docs don't specify a value for Windows 2000, but since it's part of the NT family, a reasonable guess is that it's ignored there as well.

鉴于所有这些,为适用于NT系列操作系统的方法编写代码的一种好方法可能是:

Given all that, a good way to code the method for NT-family operating systems might be this:

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.

This makes sure that you always call the hook at the end of your processing, and makes it hard to accidentally add a return that will bypass CallNextHookEx.

这篇关于如何正确使用SetWindowsHookEx&呼叫下一个挂钩的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆