13

Windows フックを正しくセットアップできますが、MSDN の次の行に混乱します。フック通知を受信できず、結果として正しく動作しない可能性があります。他のアプリケーションが通知を表示できないようにする必要が絶対にない限り、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(...);
        ...
}

では、コードが私が興味を持っているものではない場合、フック プロシージャはどうなるでしょうか。次のフックを呼び出すにはどうすればよいですか?

編集:主な問題は、HHOOK が SetWindowsHookEx から返され、それを CallNextHookEx 関数に渡す必要があることです。

更新: NT プラットフォームではフック パラメータが無視されるようです:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

4

1 に答える 1

15

ドキュメントによると、適切な方法は、受け取った引数を、受け取ったとおりにCallNextHookExに直接渡すことです。フックメッセージを処理することにしたかどうかに関係なく、CallNextHookExも呼び出す必要があります。

MSDNによると、NT / XP / 2003では最初のパラメータCallNextHookExは無視されます。古いWin95ベースのオペレーティングシステムの場合HHOOK、フックをに登録したときに受け取ったものである必要がありますSetWindowsHookEx。ドキュメントにはWindows2000の値は指定されていませんが、これは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
}

これにより、処理の最後に常にフックを呼び出すことができ、returnバイパスするを誤って追加することがなくなりCallNextHookExます。

于 2008-10-17T22:31:12.497 に答える