Question

Je peux installer correctement un hook Windows, mais la ligne dans MSDN qui dit: "Appeler la fonction CallNextHookEx pour chaîner à la prochaine procédure de hook, me laisse perplexe, mais elle est fortement recommandée; sinon, les autres applications disposant de points d'ancrage ne recevront pas de notifications de points d'accrochage et risquent de se comporter de manière incorrecte. Vous devez appeler CallNextHookEx sauf si vous devez absolument empêcher la notification d’être vue par d’autres applications. ".

Je veux être un bon citoyen en matière de programmation et appeler le prochain crochet. Mais ma procédure de hook 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 de raccordement si le code ne correspond pas à celui qui m'intéresse? Comment appeler le prochain hook?

Modifier: Le principal problème est qu'un objet HHOOK est renvoyé à partir de SetWindowsHookEx et doit être transmis à la fonction CallNextHookEx.

Mise à jour: il semble que le paramètre de raccordement soit ignoré sur les plates-formes NT:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

Était-ce utile?

La solution

Selon la documentation, il convient de transmettre les arguments que vous avez reçus directement à CallNextHookEx, exactement comme vous les avez reçus. Vous devez également appeler CallNextHookEx, que vous décidiez ou non de gérer le message de raccordement.

Selon MSDN , le premier paramètre de CallNextHookEx est ignoré sous NT / XP / 2003 et, pour les anciens systèmes d'exploitation Win95, il devrait s'agir du HHOOK que vous avez reçu lorsque vous avez enregistré votre hook avec SetWindowsHookEx . . Les documents ne spécifient pas de valeur pour Windows 2000, mais étant donné qu'ils font partie de la famille NT, il est raisonnable de supposer qu'ils sont également ignorés.

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

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
}

Ceci garantit que vous appelez toujours le hook à la fin de votre traitement et rend difficile l'ajout accidentel d'un return qui contournera CallNextHookEx .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top