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++Builder Discussion :

Appui d'un touche par programme [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut Appui d'un touche par programme
    L'instruction mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN,x,y,dwData,0) permet de simuler l'appui du bouton de la souris comme si un utilisateur avait appuyé sur le bouton de la souris.

    Je n'ai pas trouvé l'équivalent pour le clavier. J'aimerais une instruction qui simule l'appui d'une touche du clavier (par exemple une lettre). Si donc je suis sous Word et que l'instruction s'exécute, la lettre appuyée apparaîtra sous Word.

    Merci et à bientôt
    Gilles

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    j'ai utilisé cette fonction

    j’espère que c'est cela que tu cherche

    Cordialement

    Mickael

  3. #3
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Merci bien.

    Je veux bien un petit exemple pour par exemple simuler l'appui de la lettre A (e.g. dans un TEdit) car je n'ai pas réussi à trouver une syntaxe qui marche, la doc ne donne aucun exempe.

    À bientôt
    Gilles

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Voici l'exemple

    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
     
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       keybd_event('A',0,0,0);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
       Edit1->Text = (char)( Key) ;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
       BYTE keyState[256];
       bool bState = true;
       GetKeyboardState((LPBYTE)&keyState);
       if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
       {
          // Simulate a key press
          keybd_event( VK_NUMLOCK,
                          0x45,
                          KEYEVENTF_EXTENDEDKEY | 0,
                          0 );
     
          // Simulate a key release
             keybd_event( VK_NUMLOCK,
                          0x45,
                          KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                          0);
       }
    }
    //---------------------------------------------------------------------------

    Mickael

  5. #5
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    J'avoue ne pas comprendre.

    Normalement, keybd_event('A',0,0,0) simule l'appui de la lettre A par l'utilisateur, donc si le curseur est dans le TEdit, un A doit s'afficher.

    Ici vous trichez puisque sur l'événement KeyDown du bouton, vous écrivez Edit1->Text=(char)Key, ce qui a bien sûr pour effet d'afficher la lettre A. Mais cette affectation devrait être inutile si keybd_event('A',0,0,0) simulait vraiment l'appui de la lettre A. (quand un utilisateur appuie sur A, la lettre A s'affiche dans le TEdit et il n'y a aucun code supplémentaire)

    J'ai essayé de rajouter Application->ProcessMessages() juste après keybd_event('A',0,0,0) mais ça ne marche pas non plus.

    Merci quand même de votre aide.

    À bientôt
    Gilles

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    j'ai essayé avec un Timer et cela fonctionne

    quand on appuie sur le bouton pour simuler l’appuie de la lettre 'A 'sur le clavier le Focus passe du TEdit au TBouton donc le programme n’envoie pas la lettre 'A' au TEdit

    exemple avec le bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       Form1->FocusControl(Edit1);
       keybd_event('A',0,0,0);
     
    }
    Mickael

  7. #7
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Merci.

    En rajoutant Form1->FocusControl(Edit1), ça marche effectivement mais si j'enlève cette instruction et si je positionne le curseur dans le TEdit, là ça ne marche pas alors que le curseur est prêt a accueillir un caractère dans le TEdit. C'est ainsi que j'ai testé jusqu'à présent.

    Or, le curseur pourra à terme être n'importe où, par exemple sous Word et ce que j'aimerais, c'est que la lettre s'affiche quelle que soit la place du curseur comme si un utilisateur avait appuyé sur la touche.

    Merci encore et à bientôt
    Gilles

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Je me demande s'il ne faut pas rajouter un "key up" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    keybd_event(VkKeyScan('A'), 0, 0, 0);
    keybd_event(VkKeyScan('A'), 0, KEYEVENTF_KEYUP, 0);
    A noter que je n'ai pas réussi à simuler des majuscules... ???

    A plus !

  9. #9
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Merci mais ça ne marche pas.

    À bientôt
    Gilles

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    pour simuler la majuscule il faut appuyer sur la touche MAJ

    1er fois Majuscule 2eme fois Minuscule

    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
     
          keybd_event( VK_CAPITAL ,
                          0x45,
                          KEYEVENTF_EXTENDEDKEY | 0,
                          0 );
     
          // Simulate a key release
             keybd_event( VK_CAPITAL ,
                          0x45,
                          KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                          0);
           keybd_event( 'A' ,
                          0x45,
                          KEYEVENTF_EXTENDEDKEY | 0,
                          0 );
     
          // Simulate a key release
             keybd_event( 'A' ,
                          0x45,
                          KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                          0);

    Sinon pour moi cette fonction corespond à l'appui sur le clavier, si tu mets un document Word en premier plan on arrive à remplir le document avec des lettre "AaAaA"

    je ne comprends pas bien ce qui te manque dans cette fonction

    A+
    Mickael

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 71
    Points : 75
    Points
    75
    Par défaut
    Bonjour

    Sur un TEdit il faut mettre AutoSelect à false pour que ça marche, ça met les caractères demandés au niveau du curseur.

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Sinon il y a aussi la possibilité d'envoyer un WM_CHAR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(Form1->ActiveControl->Handle, WM_CHAR, 'a' ,0);
    A plus !

  13. #13
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Merci mais ça ne marche que si j'ajoute juste avant Form1->FocusControl(Edit1), s'il n'y a que votre instruction et si je positionne le curseur sur le TEdit, ce qui normalement devrait lui donner le focus, ça ne marche pas.

    Cela dit, cette syntaxe ne me convient pas car il me faut connaître un Handle et ça m'ennuie. Si je mets mon curseur dans Word, je n'ai pas envie d'aller chercher un Handle, le curseur étant positionné n'importe où, je voudrais simplement simuler un utilisateur qui appuie sur une touche et afficher la lettre correspondante dans le logiciel actif à ce moment-là.

    Merci quand même de votre aide.

    À bientôt
    Gilles

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Regarde du côté des hooks clavier..je sais qu'ils permettent de capturer toutes les saisies mais je crois qu'ils te permettent aussi de simuler des saisies.

    Une petite recherche sur MSDN et tu devrais trouve, je n'ai plus le liens dans mes favoris désolé.
    Neilos

Discussions similaires

  1. Réponses: 30
    Dernier message: 19/03/2010, 00h06
  2. Réponses: 9
    Dernier message: 15/05/2007, 16h45
  3. Réponses: 3
    Dernier message: 04/04/2007, 16h22
  4. [VBA-E] Pause arréter par l'appui d'une touche
    Par gengen dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/05/2006, 13h03
  5. Sortir d'un while par l'appui d'une touche ?
    Par voxel dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 18/08/2004, 09h44

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