WH_KEYBOARD hook [Résolu]

Signaler
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014
-
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014
-
Bonjour

J'ai écrit une DLL en C, qui me permet d'ajouter et de retirer un hook de type WH_KEYBOARD.
Mon problème est de savoir dans quelle fenêtre est survenu l'évènement.

En effet quelle que soit la fenêtre de mon application qui est affichée, la procédure du hook est exécutée quand je tape une touche au clavier, et je ne vois pas comment limiter l'exécution de la procédure, pour qu'elle ne s'exécute que lorsque l'évènement a lieu dans une fenêtre bien précise.

En gros je voudrais faire la même chose que dans Visual Basic, avec (par exemple) l'évènement KeyDown sur un contrôle TextBox : le handler est bien exécuté uniquement lorsqu'une touche est enfoncée dans ce textbox !

Merci

7 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Tu as deux choix:
1- Si tu veux garder ton hook, tu peux utiliser la fonction GetFocus() pour connaitre le HWND de la fenêtre ou le controle ayant le focus.
2- Comme indiqué par Joky, tu peux sous-classer ton EditBox:
// Déclarer en global une variable WNDPROC:
WNDPROC OldProc;
// Implémenter une fonction de sous-classement:
HRESULT CALLBACK NewProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    If(message==WM_KEYDOWN)
    {
        MessageBox(0, "WM_KEYDOWN intercepté","",0);.
        return 0;
    }
    return CallWindowProc(OldProc, hwnd, message, wParam, lParam);
}
// Juste après la création de l'Edit ou la récupération de son HWND pendant
// WM_CREATE ou WM_INITDIALOG, on change l'adresse de sa fonction:
OldProc=(WNDPROC) SetWindowLong(hwndEdit, GWL_WNDPROC, (long)NewProc);

Il est à noter qu'une seule procédure de sous-classement peut servir pour tous les controles EDIT de l'application. Le HWND permet de les différencier.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Dans ce cas là, pas besoin de Hook
Effectue juste un sous-classement sur le contrôle que tu as besoin et voilà traite les messages WM_KEYDOWN et WM_KEYUP

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014

j'ai cité le fonctionnement d'un contrôle Visual Basic comme EXEMPLE....

ma question concerne bien une fenêtre Windows de base...
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
C'est le même principe avec une fenêtre sauf que le sous-classement n'est même pas utile...

switch(Msg)
{
    case WM_KEYDOWN:
       //On a pressé une touche alors que la fenêtre à le focus...
       return 0;
}
...
ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Joky >> Avec une fenêtre, on fait du sous-classement implicite. En effet, c'est la procédure par défaut de la fenêtre  qui est sous-classée. La procédure de sous-classement est celle déclarée dans le membre lpfnWndProc de la structure WNDCLASS. Si le message n'est pas traité dans cette procédure, on devra appeler la fonction DefWindowProc() pour le passer à la procédure par défaut. Sinon, notre fenêtre ne s'affichera jamais.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Ah... En effet c'est vrai que c'est du sous-classement. Mais il est bien dissimuler :p

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014

Merci, la fonction GetFocus() me convient (je l'avais trouvée hier soir !)