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

 C Discussion :

VkKeyScan et caractère spéciaux


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut VkKeyScan et caractère spéciaux
    Bonjour,

    Avec keybd_event(), je voudrais pouvoir afficher les les caractères tels que . @ / ...
    Sauf que tous les codes ASCII sont correctement convertis mais pour le @ 0x40 ou . 0x2E, ça ne m'affiche rien ! Je ne comprends pas ce qui ce passe ?

    keybd_event(0x61,0,0,0) // m'affiche un a
    keybd_event(0x40,0,0,0) // ne m'affiche rien

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Pour commencer, le MSDN dit de ne plus utiliser cette fonction mais plutôt SendInput.
    Ensuite, si je regarde la table des VK codes, je trouve
    (0x3A-40) Undefined.
    Enfin, (mais là je vais peut être dire une bêtise), tu es supposé simuler un appui clavier: donc @ c'est ALT+CTRL+0 soit trois appuis non?

  3. #3
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Bonjour,

    keybd_event simule le clavier, donc rien à voir avec les codes ASCII. Il se trouve que les codes ASCII des lettres correspondent aux codes clavier, mais la similitude s'arrête là (ou presque).

    J'ai déjà utilisé SendInput et j'ai remarqué qu'il faut envoyer toute la séquence d'un coup sinon ça a un comportement aléatoire.
    On ne doit pas faire :
    SendInput : appui sur Ctrl
    SendInput : appui sur Alt
    ...
    SendInput : relache Ctrl

    Mais faire un tableau qui représente la séquence (6 évéments) et l'envoyer dans 1 seul SendInput.

    Qui dit simulation clavier, dit faire attention au clavier utilisé. Perso j'utilisais les chiffres et on a de belle surprise si on est en clavier FR ou EN.

    voici un morceau de mon code qui envoie un pipe | (alt+ctrl+6)
    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
    		// Atl down
    		stInput[nNumChar].type = INPUT_KEYBOARD;
    		stInput[nNumChar].ki.dwExtraInfo = 0;
    		stInput[nNumChar].ki.time = 0;
    		stInput[nNumChar].ki.wScan = MapVirtualKey(VK_MENU, 0);
    		stInput[nNumChar].ki.wVk = VK_MENU;
    		// KEY_DOWN
    		stInput[nNumChar].ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    		nNumChar++;
     
    		// ctrl down
    		stInput[nNumChar].type = INPUT_KEYBOARD;
    		stInput[nNumChar].ki.dwExtraInfo = 0;
    		stInput[nNumChar].ki.time = 0;
    		stInput[nNumChar].ki.wScan = MapVirtualKey(VK_CONTROL, 0);
    		stInput[nNumChar].ki.wVk = VkKeyScan(VK_CONTROL);
    		// KEY_DOWN
    		stInput[nNumChar].ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    		nNumChar++;
    		// 6 down
    		stInput[nNumChar].type = INPUT_KEYBOARD;
    		stInput[nNumChar].ki.dwExtraInfo = 0;
    		stInput[nNumChar].ki.time = 0;
    		stInput[nNumChar].ki.wScan = MapVirtualKey('6', 0);
    		stInput[nNumChar].ki.wVk = VkKeyScan('6');
    		// KEY_DOWN
    		stInput[nNumChar].ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    		nNumChar++;
    		nNumChar++;
    		// 6 up
    		stInput[nNumChar].type = INPUT_KEYBOARD;
    		stInput[nNumChar].ki.dwExtraInfo = 0;
    		stInput[nNumChar].ki.time = 0;
    		stInput[nNumChar].ki.wScan = MapVirtualKey('6', 0);
    		stInput[nNumChar].ki.wVk = VkKeyScan('6');
    		// KEY_DOWN
    		stInput[nNumChar].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
    		nNumChar++;
     
    		// ctrl up
    		stInput[nNumChar].type = INPUT_KEYBOARD;
    		stInput[nNumChar].ki.dwExtraInfo = 0;
    		stInput[nNumChar].ki.time = 0;
    		stInput[nNumChar].ki.wScan = MapVirtualKey(VK_CONTROL, 0);
    		stInput[nNumChar].ki.wVk = VkKeyScan(VK_CONTROL);
    		// KEY_DOWN
    		stInput[nNumChar].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
    		nNumChar++;
     
    		// Alt up
    		stInput[nNumChar].type = INPUT_KEYBOARD;
    		stInput[nNumChar].ki.dwExtraInfo = 0;
    		stInput[nNumChar].ki.time = 0;
    		stInput[nNumChar].ki.wScan = MapVirtualKey(VK_MENU, 0);
    		stInput[nNumChar].ki.wVk = VK_MENU;
    		// KEY_UP
    		stInput[nNumChar].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
    		nNumChar++;
     
    		nNbCharSent = SendInput (nNumChar, stInput, sizeof (INPUT));
    		if (nNbCharSent != nNumChar)
    			return GetLastError();

  4. #4
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Merci, pour simuler alt ctrl 0 il faut l'attribut KEYEVENTF_KEYDOWN sauf qu'il n'est pas reconnu par le compilateur alors que KEYEVENTF_KEYUp l'est ?
    y'a t-il une raison à cela ?

    Merci

  5. #5
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    En effet, je ne sais pas trop pourquoi mais il faut ajouter une variable de compil, ou plutôt placer le #define au bon endroit pour éviter de faire planter la compil des autres fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // _WIN32_WINNT > 0x0400
    #define _WIN32_WINNT	0x0501
    #include <winuser.h>

  6. #6
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Ça ne fonctionne pas avec ces lignes de code en plus.
    J'ai résolu quelques problèmes. Cependant je ne sais pas comment faire un "." aux vues des VK disponiblent. Mais il doit pourtant bien y avoir un moyen ?

    Voici le code actuel :
    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
     
    int main(int argc, _TCHAR* argv[])
    {
     
     
        system("title simulation clavier");
        system("MODE CON cols=100 lines=30");
        system("color 7a");
        char message[1000];
        int boucle=0;
        int b=0;
        int c=0;
        int d=0;
     
        printf("----------------------------------------------------------------------------------------\n\n");
        printf("phrase : \n\n");
        gets(message);
        printf("----------------------------------------------------------------------------------------\n\n");
     
        int taille=strlen(message);
     
     
        printf("repeter : \n\n");
        scanf("%d",&boucle);
        printf("----------------------------------------------------------------------------------------\n\n");
     
       _sleep(3000);
     
     
     
        HWND h = GetForegroundWindow();
        SetForegroundWindow(h);
     
    	while ( b<boucle )
    	    {
                               for ( c ; c<taille ; c++ )
                                   {                     
                                            char temp[1];
                                            sprintf(temp,"%c",message[c]);
     
     
                                            if ( strcmp(temp,"@")==0 )
                                               {
                                                   keybd_event(VK_MENU,0,0,0);
                                                   keybd_event(VK_CONTROL,0,0,0);
                                                   keybd_event(0x30,0,0,0);
                                                   keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
                                                   keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
                                                   keybd_event(0x30,0,KEYEVENTF_KEYUP,0);
                                                   _sleep(50);
                                                }
     
                                       else if ( strcmp(temp,"4")==0 )
                                               {
                                                   keybd_event(0x64,0,0,0);
                                                   _sleep(50);
                                               }
     
                                       else if ( strcmp(temp,"8")==0 )
                                               {
                                                   keybd_event(0x68,0,0,0);
                                                   _sleep(50);
                                               }
     
                                       else if ( strcmp(temp,".")==0 )
                                               {
                                                   //???
                                                   _sleep(50);
                                               }
     
                                       else    {
                                                  keybd_event(VkKeyScan(message[c]),0,0,0);
                                                  _sleep(50);
                                               }
     
                                   }
     
                                   c=0;
                                   keybd_event(VK_RETURN,0,0,0);
                                   _sleep(3000);
                                   b++;
            }
     
     
     
     
     
       }
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. caractères spéciaux
    Par mat10000 dans le forum Flash
    Réponses: 16
    Dernier message: 23/10/2003, 13h22
  2. Où trouver la liste des caractères spéciaux?
    Par gamez dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2003, 17h54
  3. Transformation XSL et caractères spéciaux
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 4
    Dernier message: 28/04/2003, 10h38
  4. [Sybase] filtre sur caractères spéciaux
    Par montelieri dans le forum Sybase
    Réponses: 4
    Dernier message: 07/04/2003, 16h49
  5. Traiter les caractères spéciaux
    Par ricola dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2003, 09h23

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