Frage

Ich kann richtig Setup auf ein Fenster Haken, aber ich habe durch die Linie in MSDN verwirrt, die „Aufruf der CallNextHookEx Funktion Kette zum nächsten Hookprozedur sagt, ist optional, aber es ist sehr zu empfehlen, da sonst andere Anwendungen, die haben installiert Haken nicht Haken Benachrichtigungen erhalten und falsch als Ergebnis verhalten. Sie sollten CallNextHookEx nennen, wenn Sie absolut die Meldung zu verhindern, müssen die von anderen Anwendungen gesehen zu werden. ".

Ich möchte eine gute Programmierung Bürger sein und den nächsten Haken nennen. Aber, mein Hookprozedur sieht wie folgt aus:

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

Also, was passiert in der Hook-Prozedur, wenn der Code nicht derjenige ist, in denen ich interessieren? Wie kann ich den nächsten Haken nennen?

Edit:. Das Hauptproblem ist, dass ein hHook vom SetWindowsHookEx zurückgeführt wird, und das muss die CallNextHookEx Funktion übergeben wird

Update: Es scheint der Haken Parameter auf den NT-Plattformen ignoriert wird:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

War es hilfreich?

Lösung

Nach der Dokumentation, ist die richtige Sache zu tun, um die Argumente übergeben Sie direkt an CallNextHookEx erhalten, genau so, wie Sie sie erhalten haben. Sie sollten auch CallNextHookEx unabhängig davon, rufen Sie, ob Sie den Haken Nachricht zu handhaben entschieden.

Laut MSDN wird der erste Parameter CallNextHookEx ignoriert auf auf NT / XP / 2003, und für ältere Win95-basierten Betriebssystemen sollte es die HHOOK Sie erhalten, wenn Sie Ihre Haken mit SetWindowsHookEx registriert. Die Dokumente geben keinen Wert für Windows 2000, aber da es einen Teil der NT-Familie ist, eine vernünftige Vermutung ist, dass es auch dort ignoriert wird.

Da alles, was ein guter Weg, um das Verfahren für NT-Familie Betriebssysteme codieren könnte dies sein:

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
}

Dies stellt sicher, dass Sie den Haken immer rufen am Ende Ihrer Verarbeitung und macht es schwer, ein return versehentlich hinzuzufügen, die CallNextHookEx umgehen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top