SetWindowsHookEx&を正しく使用する方法CallNextHookEx
質問
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
を誤って追加することが難しくなります。