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

Linux Discussion :

[X11] Simuler des appuis de touches


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [X11] Simuler des appuis de touches
    Bonjour à tous,
    Dans ma tentative de la pratique de la programmation pour m'éxercer et m'amuser je suis tombé sur un os pour lequel je ne trouve pas de documentation satisfaisante :
    j'essaie, sous linux, de simuler l'appui de touches. J'ai trouvé cet exemple de code, qui utilise la X11 et qui marche :


    /* it is compatible with latin keyboard */
    #include <X11/extensions/XTest.h>
    #define XK_LATIN1
    #define XK_MISCELLANY
    #define XK_XKB_KEYS
    #include <X11/keysymdef.h>
    #include <X11/Xlib.h>
    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char **argv)
    {
    Display* pDisplay = XOpenDisplay( NULL );

    KeySym key[] = { XK_h,XK_e,XK_l,XK_l,
    XK_o,XK_space,XK_w,XK_o,
    XK_r,XK_l,XK_d,XK_Return};
    int i;

    for( i = 0; i < 12; i++ )
    {
    XTestFakeKeyEvent ( pDisplay, XKeysymToKeycode( pDisplay, key[i] ),
    True, 100);
    }

    XTestFakeKeyEvent ( pDisplay, XKeysymToKeycode( pDisplay, key[11] ),
    False, CurrentTime );

    if( pDisplay == NULL ) return 1;

    XCloseDisplay(pDisplay);
    return 0;
    }

    Mon problème est que je voudrais pouvoir avoir en entrée une chaine de caractère, qui serait alors écrite. Mais pour cela, il faudrait que je trouve l'équivalent en keySym pour chaque caractère. Est-ce que quelqu'un saurait comment faire ?
    (Si vous souhaitez compiler le code, il faut installer la bibliothèque libxtst-dev)

    Merci de votre aide,
    Cordialement.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    d'abord il faudrait faire une boucle infinie dans laquelle on regarde les évènemens arrivés sur le serveur...

    Ensuite, il faudrait créer des événements correspondant aux touches (via XSendEvent sans doute).

    Enfin il faudrait pouvoir les intercepter dans la boucle infinie...

    De plus, dans la boucle infinie, ne pas oublier de remttre un DispatchEvent si ce n'est pas le bon évèneent (sinon tout gèle)...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Tu as la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    KeySym XStringToKeysym( char *string )
    qui permet de récupérer le KeySym correspondant à la chaine string. Par exemple, XStringToKeysym( "a" ); te donnera 97, le KeySym correspondant à "a".

    @souviron34 : C'est quoi ce DispatchEvent ? J'avoue que je n'en ai jamais entendu parler..

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    En effet, c'était bien XStringToKeysym que je cherchais, je l'ai trouvé en cherchant à tête reposée.
    Merci à vous deux de votre aide. @souviron34, j'ai pas vraiment compris (ni cherché j'avoue) ce que tu as dis, mais je suis pas sur que ça correspondait à ce que je cherchais.
    Comme c'est assez dur de trouver des exemples de code, je vais poster le mien, si ça peut servir...

    /* le mot en paramètre est tapé, suivi par un appui sur la touche entrée */
    #include <X11/extensions/XTest.h>
    #define XK_LATIN1
    #define XK_MISCELLANY
    #define XK_XKB_KEYS
    #include <X11/keysymdef.h>
    #include <X11/Xlib.h>
    #include <stdio.h>
    #include <stdlib.h>

    int main (int argc, char **argv) {
    Display *display = XOpenDisplay(NULL);

    char *string = argv[1];

    int i;
    KeySym ksym;
    char a[2];

    a[1] = '\0';

    for (i=0; string[i] != '\0'; i++) {
    *a = string[i];
    ksym = XStringToKeysym(a);

    XTestFakeKeyEvent ( display, XKeysymToKeycode (display, ksym),
    True, 100);
    XTestFakeKeyEvent ( display, XKeysymToKeycode (display, ksym),
    False, CurrentTime);

    }

    XTestFakeKeyEvent (display, XKeysymToKeycode (display, XK_Return), False, CurrentTime);

    if ( display == NULL ) return 1;

    XCloseDisplay (display);
    return 0;
    }

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Je ne connais pas cette fonction XTestFakeKeyEvent..


    Ce dont je parlais, ne la connaissant pas, c'était :

    générer un event du type KeyEvent
    Le surveiller dans la boucle

    Citation Envoyé par calving Voir le message
    @souviron34 : C'est quoi ce DispatchEvent ? J'avoue que je n'en ai jamais entendu parler..
    Le principe de fond d'une appli X, c'est de surveiller des événements apparaissant sur le serveur X.

    Donc un programme basique en X est :

    • ouvrir le display
    • faire une boucle infinie surveillant les événements (XNextEvent)
    • faire un switch sur le type d'événement
    • si c'est l'événement qu'on souhaite traiter, le traiter
    • sinon, le remettre sur la pile (XDispatchEvent)
  6. fermer le display



  7. Si on ne fait pas le Dispatch, l'événement est retiré de la queue par XNextEvent, et donc il n'est plus traité par le serveur X. En particulier, la fermeture de la fenêtre ou tout autre événement (Expose par exemple)

+ Répondre à la discussion
ActualitésFAQ LINUXTUTORIELS LINUXOUTILS LINUXLIVRES LINUXLINUX TVUNIXGTK+QtAPACHEOPEN SOURCE

Discussions similaires

  1. [XL-2007] Simulation d'appuie sur touche
    Par Jason T dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/05/2009, 14h29
  2. Réponses: 22
    Dernier message: 24/10/2006, 17h04
  3. simuler l'appui de touches
    Par polo42 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/07/2006, 11h47
  4. Simuler un appui de touche clavier
    Par Floo dans le forum Assembleur
    Réponses: 5
    Dernier message: 03/12/2004, 17h04
  5. Simuler l'appui de touches
    Par immerczeck dans le forum Assembleur
    Réponses: 5
    Dernier message: 21/04/2004, 17h23

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