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

Visual C++ Discussion :

Message WM_KEYDOWN : comment traduire les touche VK_X en caractere


Sujet :

Visual C++

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut Message WM_KEYDOWN : comment traduire les touche VK_X en caractere
    Bonjour,

    j'intercepte les message windows afin d'obtenir la saisie d'un lecteur code barre,

    je cherche comment obtenir le code caractere du VK_KKChose

    exemple : VK_NUMPAD8 -> '8' et ce pour tout les caracteres VK_....

    Merci

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu veux la liste des correspondances c'est ca ? si oui, c'est dans msdn
    si non, j'ai pas compris la question

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    il faut faire a la main ?

    y'a pas de fonction pour faire ca ?

    faut reellement faire comme ca :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    BOOL DlScanner::PreTranslateMessage(MSG* pMsg)
    {
       if ( pMsg->message == WM_KEYDOWN ) // evenement = pression d'une touche
       {
    		// Ecart maximal de 250 ms entre chaque touche sinon on vide le buffer
    	    DWORD dwNow = GetTickCount();
    		if ( (dwNow - p_dwLastInput) > 250 ){
    			p_KeyInput = "";
    			p_dwLastInput = dwNow;
    		}
     
    		TRACE("%c : %d \n\r", pMsg->wParam,pMsg->wParam);
     
    	   // winuser.h
    	   // VK_NUMPAD0 -> VK_NUMPAD9
    	   if ( (pMsg->wParam >= 0x60) &&  (pMsg->wParam <= 0x69 )) 
           {
    			p_KeyInput.AppendFormat("%c", pMsg->wParam - VK_NUMPAD0 + '0');
    		   return TRUE; // fin de l'analyse du message
    	   }
              // ascii
    	   else if ( (pMsg->wParam >= 32) &&  (pMsg->wParam <= 128)) 
           {
    			p_KeyInput.AppendFormat("%c", pMsg->wParam);
    		   return TRUE; // fin de l'analyse du message
    	   }
    	   else if (pMsg->wParam == VK_RETURN)	// touche [ ENTER ]
    	   {
    		   if (p_KeyInput != "")
    		   {			   
    			   AnalyseCodeBarre(p_KeyInput);
    		   }
     
    		   p_KeyInput = "";
     
    		   return TRUE; // fin de l'analyse du message
    	   }
    	}
        return CDialog::PreTranslateMessage(pMsg); // retransmission du message si non traité
    }

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    remarquez,

    ce code est faux car comment savoir qu'il s'agit du code VK_NUMPAD1 est non du caractere ASCII 'a'

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    OK, je capte, en fait j'avais mal interpreté le message WM_KEYDOWN

    Lui ne retourne que les codes virtuels, et quand le terminal de scan retourne de l'ascii, c'est avec WM_CHAR

    du coup, le code suivant semble fonctionner avec les differentes douchettes code-barres que j'ai :

    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
    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
    BOOL DlScanner::PreTranslateMessage(MSG* pMsg)
    {
       if ( pMsg->message == WM_CHAR ) // evenement = pression d'une touche
       {
     
    		// Ecart maximal de 100 ms entre chaque touche sinon on vide le buffer
    	    DWORD dwNow = GetTickCount();
    		if ( (dwNow - p_dwLastInput) > 1000 ){
    			p_KeyInput = "";
    			p_dwLastInput = dwNow;
    		}
     
    		// winuser.h
    		p_KeyInput.AppendFormat("%c", pMsg->wParam);
     
    		TRACE("KEY : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput);
     
    		return TRUE; // fin de l'analyse du message
     
    	}
       else if ( pMsg->message == WM_KEYDOWN ) // evenement = pression d'une touche
       {
     
    		// Ecart maximal de 100 ms entre chaque touche sinon on vide le buffer
    		DWORD dwNow = GetTickCount();
    		if ( (dwNow - p_dwLastInput) > 1000 ){
    			p_KeyInput = "";
    			p_dwLastInput = dwNow;
    		}
     
    		// winuser.h
     
    		// VK_NUMPAD0 -> VK_NUMPAD9
    		if ( (pMsg->wParam >= 0x60) &&  (pMsg->wParam <= 0x69 )) 
    		{
    			p_KeyInput.AppendFormat("%c", pMsg->wParam - VK_NUMPAD0 + '0');
    			TRACE("DOWN : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput);
    			return TRUE; // fin de l'analyse du message
    		}
    	   // VK_A - VK_Z
    	   else if ( (pMsg->wParam >= 0x41) &&  (pMsg->wParam <= 0x5A )) 
           {
    			p_KeyInput.AppendFormat("%c", pMsg->wParam - 0x41 + 'A');
    			TRACE("DOWN : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput);
    		   return TRUE; // fin de l'analyse du message
    	   }
    	   else if (pMsg->wParam == VK_RETURN)	// touche [ ENTER ]
    	   {
    		   if (p_KeyInput != "")
    		   {			   
    			   AnalyseCodeBarre(p_KeyInput);
    		   }
     
    		   p_KeyInput = "";
     
    		   TRACE("DOWN : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput);
    		   return TRUE; // fin de l'analyse du message
    	   }
       }
     
     
     
        return CDialog::PreTranslateMessage(pMsg); // retransmission du message si non traité
    }
    Alors, en test, on a ou WM_CHAR ou WM_KEYDOWN, ma question : ce sera toujours comme ca, ou les 2 peuvent intervenir ? et du coup, j'aurai une double lecture

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    le 'sens' du message est clair :
    keydown c'est sur l'appui d'une touche.
    wm_char c'est sur la réception d'un caractère.
    d'un coté on parle de touche enfoncée ,de l'autre de caractère reçu ...
    leur usage est différent et il est évident que si tu traites les deux messages tu auras deux fois la réponse..

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    Slt Farscape,

    c'est ce que je pensais, et portant ce n'est pas le cas, que ce soit de la saisie par le terminal de lecture de code-barres ou par le clavier que je le fais,

    Je n'ai qu'un cas ou l'autre et du coup, mon CString p_KeyInput est nickel, qu'en penses tu ?

    ci-après mon code actuel de réception :

    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
    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
     
    BOOL DlScanner::PreTranslateMessage(MSG* pMsg)
    {
       if ( pMsg->message == WM_CHAR ) // evenement = pression d'une touche
       {
     
    		// Ecart maximal de 500 ms entre chaque touche sinon on vide le buffer
    	    DWORD dwNow = GetTickCount();
    		if ( (dwNow - p_dwLastInput) > 500 ){
    			p_KeyInput = "";
    			p_dwLastInput = dwNow;
    		}
     
    		// winuser.h
    		p_KeyInput.AppendFormat("%c", pMsg->wParam);
     
    		TRACE("KEY : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput);
     
    		return TRUE; // fin de l'analyse du message
     
    	}
       else if ( pMsg->message == WM_KEYDOWN ) // evenement = pression d'une touche
       {
     
    		// Ecart maximal de 500 ms entre chaque touche sinon on vide le buffer
    		DWORD dwNow = GetTickCount();
    		if ( (dwNow - p_dwLastInput) > 500 ){
    			p_KeyInput = "";
    			p_dwLastInput = dwNow;
    		}
     
    		// winuser.h
     
    		// VK_NUMPAD0 -> VK_NUMPAD9
    		if ( (pMsg->wParam >= 0x60) &&  (pMsg->wParam <= 0x69 )) {
    			p_KeyInput.AppendFormat("%c", pMsg->wParam - VK_NUMPAD0 + '0');
    		}
    	   // VK_0 - VK_9
    	   else if ( (pMsg->wParam >= 0X30) &&  (pMsg->wParam <= 0x39 )){
    			p_KeyInput.AppendFormat("%c", pMsg->wParam - 0x30 + '0');
    	   }
    	   // VK_A - VK_Z
    	   else if ( (pMsg->wParam >= 0x41) &&  (pMsg->wParam <= 0x5A )){
    		   if ( (GetKeyState(VK_SHIFT)) ^ (GetKeyState(VK_CAPITAL)) ){
    				p_KeyInput.AppendFormat("%c", pMsg->wParam - 0x41 + 'A');
    		   }
    		   else{
    				p_KeyInput.AppendFormat("%c", pMsg->wParam - 0x41 + 'a');
    		   }
    	   }
    	   else if (pMsg->wParam == VK_RETURN){	// touche [ ENTER ]
    		   if (p_KeyInput != ""){			   
    			   AnalyseCodeBarre(p_KeyInput);
    		   }
    		   p_KeyInput = "";
    	   }
    	   else if (pMsg->wParam == VK_SPACE){
    		   p_KeyInput.Append(" ");
    	   }
    	   else if (pMsg->wParam == VK_MULTIPLY){
    		   p_KeyInput.Append("*");
    	   }
    	   else if (pMsg->wParam == VK_ADD){
    		   p_KeyInput.Append("+");
    	   }
    	   else if (pMsg->wParam == VK_SUBTRACT){
    		   p_KeyInput.Append("-");
    	   }
    	   else if (pMsg->wParam == VK_DECIMAL){
    		   p_KeyInput.Append(".");
    	   }
    	   else if (pMsg->wParam == VK_DIVIDE){
    		   p_KeyInput.Append("/");
    	   }
     
    	   return TRUE;
       }
     
     
     
        return CDigiDialog::PreTranslateMessage(pMsg); // retransmission du message si non traité
    }

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/08/2006, 11h38
  2. Réponses: 3
    Dernier message: 30/06/2006, 14h39
  3. [TMemo] Comment insérer les touches pressées ?
    Par Alexandre` dans le forum Composants VCL
    Réponses: 8
    Dernier message: 28/03/2005, 16h36

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