質問

Windowsフックを正しく設定できますが、次のフックプロシージャにチェーンするためにCallNextHookEx関数を呼び出すことはオプションであるという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/

役に立ちましたか?

解決

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

MSDNによると CallNextHookExの最初のパラメーターNT / XP / 2003ではは無視され、古いWin95ベースのオペレーティングシステムでは、フックを SetWindowsHookEx に登録したときに受け取った HHOOK である必要があります。 。ドキュメントではWindows 2000の値を指定していませんが、NTファミリーの一部であるため、合理的な推測としては、Windows 2000でも無視されます。

これらすべてを考えると、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