Comment utiliser correctement SetWindowsHookEx & CallNextHookEx

je peux correctement configurer un crochet de windows, mais je suis confus par la ligne dans MSDN qui dit" appeler la fonction CallNextHookEx à la chaîne à la procédure crochet suivante est facultatif, mais il est fortement recommandé; sinon, d'autres applications qui ont installé des crochets ne recevront pas de notifications crochet et peuvent se comporter incorrectement en conséquence. Vous devez appeler CallNextHookEx sauf si vous avez absolument besoin d'empêcher la notification d'être vu par d'autres applications.".

je veux être un bon citoyen de programmation et appeler le prochain crochet. Mais, ma procédure de crochet ressemble à ceci:

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

alors, que se passe-t-il dans la procédure hook si le code n'est pas celui qui m'intéresse? Comment j'appelle le prochain crochet?

Edit: Le principal problème est qu'une HHOOK est retourné à partir de la SetWindowsHookEx, et qui doit être transmise à la fonction de CallNextHookEx.

mise à jour: il semble que le paramètre hook soit ignoré sur les plateformes NT:

http://msdn.microsoft.com/en-us/library/ms644974.aspx

http://www.klenotic.com/pl/null_hhook /

8
demandé sur Mark Ingram 2008-10-18 02:16:50

1 réponses

selon les docs, la bonne chose à faire est de passer les arguments que vous avez reçus directement à CallNextHookEx, exactement comme vous les avez reçus. Vous devez également appeler CallNextHookEx que vous ayez décidé ou non de gérer le message hook.

selon MSDN , le premier paramètre de CallNextHookEx est ignoré sur NT/XP/2003, et pour les systèmes D'exploitation plus anciens basés sur Win95, il devrait être le HHOOK que vous avez reçu lorsque vous vous êtes enregistré votre crochet avec SetWindowsHookEx . Les docs ne spécifient pas de valeur pour Windows 2000, mais comme il fait partie de la famille NT, une supposition raisonnable est qu'il est ignoré là aussi.

étant donné tout cela, un bon moyen de coder la méthode pour les systèmes D'exploitation de la famille NT pourrait être ceci:

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
}

Cela fait en sorte que vous appelez toujours le crochet à la fin de votre traitement, et rend difficile d'ajouter accidentellement un return qui contournera CallNextHookEx .

10
répondu Charlie 2008-10-18 16:37:39