WH_KEYBOARD hook

Résolu
chris_brabant Messages postés 64 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 29 septembre 2014 - 14 déc. 2006 à 13:12
chris_brabant Messages postés 64 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 29 septembre 2014 - 15 déc. 2006 à 13:56
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

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 déc. 2006 à 15:35
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.
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 déc. 2006 à 13:19
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"
0
chris_brabant Messages postés 64 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 29 septembre 2014
14 déc. 2006 à 15:21
j'ai cité le fonctionnement d'un contrôle Visual Basic comme EXEMPLE....

ma question concerne bien une fenêtre Windows de base...
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 déc. 2006 à 16:09
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"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 déc. 2006 à 16:56
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.
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 déc. 2006 à 17:07
Ah... En effet c'est vrai que c'est du sous-classement. Mais il est bien dissimuler :p

ULARGE_INTEGERJokyQi=QI("Joky"
0
chris_brabant Messages postés 64 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 29 septembre 2014
15 déc. 2006 à 13:56
Merci, la fonction GetFocus() me convient (je l'avais trouvée hier soir !)
0
Rejoignez-nous