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 :

[X11] Comment utiliser XSendEvent?


Sujet :

C

  1. #1
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut [X11] Comment utiliser XSendEvent?
    Bonsoir,
    je suis en train de développer un jeu en X11 dans le cadre d'un projet de la fac. L'idée est de développer un client X invisible qui envoie la touche 2 du clavier à la fenetre principale que je passe en paramètre à ma fonction. Le problème est que ca ne marche pas. Je vous laisse mon code et que vous pouvez m'aider svp :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <strings.h>
    #include <time.h>
    #include <X11/Xutil.h>
    #include <X11/Xresource.h>
    #include <X11/Xlib.h>
     
    Display *dpy;
     
    int main(int argc, char **argv){
    Window agresseur, victime;
    XKeyEvent esend;
     
     
     if(argc == 0){
      fprintf(stderr,"Usage : hexagere <numero_de_fenetre>\n");
      return -1;
     }
     
     
     victime = atol(argv[0]);
     
     if (! (dpy = XOpenDisplay(":0.0"))) {
        fprintf(stderr, "%s: dispositif %s injoignable\n", argv[0],
                  XDisplayName(NULL));
        return -1;
      }
     
     
     agresseur = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
    			      0, 0, 10, 10,
    			      1,
    			      WhitePixel(dpy, DefaultScreen(dpy)),
    			      BlackPixel(dpy, DefaultScreen(dpy)));
     
     
     XSelectInput(dpy, agresseur, KeyPressMask);
     
     esend.display = dpy;
     esend.window = victime;
     esend.type = KeyPress;
     esend.keycode = XKeysymToKeycode(dpy,XK_2);
     esend.state = 0;
     
     srand(time(NULL));
     while(1){
       if ( XSendEvent(esend.display,esend.window,True, KeyPressMask, (XEvent *)&esend) == True)
            fprintf(stdout,"Event sent\n");
     
       XFlush(dpy);
       int r = (int)((rand() % 15) + 1);
       fprintf(stdout,"Rand : %d\n", r);
       sleep(r);
     }
     
     
     return 0;
    }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 444
    Par défaut
    Ça m'a l'air douteux, comme programme. C'est pour jouer à quel genre de jeu ?

    Bon, à vue de nez (et même un peu plus loin car j'ai réussi à faire fonctionner ton programme sur ma machine) :

    • Le premier paramètre de ta ligne de commande − argv[0] − c'est le nom du programme lui-même. La valeur du numéro de ta fenêtre est donc dans argv[1] minimum ;
    • Même chose dans « if argc==0 ». Dans des conditions normales de lancement (depuis la ligne de commande), argc est au minimum égal à 1 ;
    • La fenêtre « agresseur » ne sert à rien en l'état actuel des choses. Elle n'a pas besoin d'exister pour que le client puisse s'épanouir librement ;
    • C'est bien de simuler un KeyPress, c'est mieux si tu simules en plus le KeyRelease censé le suivre juste après, avec le délai de rigueur ;
    • XKeysymToKeycode(), c'est une bonne idée, mais tu ne vérifies pas si cette fonction te renvoie un résultat correct ou non. Deux choses peuvent la faire planter :
      1. Le fait que le caractère n'existe pas sur ton clavier ;
      2. Le fait que ce caractère existe à plusieurs endroits ou avec l'aide de touches mortes.
    • Enfin, vérifie que que atol() a bien compris le numéro de fenêtre que tu lui passes. En particulier, cette fonction n'apprécie pas du tout l'hexadécimal.

  3. #3
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Ouf, merci pour ta réponse. En fait, l'erreur vient du fait que je passais argv[0] et argv[1] à mon prog. Faute d'inattention evidemment et trop de java .
    En fait, l'objectif du projet est de développer une version d' xhextris en multijoueur.
    En tout cas je prends note de tes remarques et encore une fois merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. Comment utiliser un cache ?
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 14/03/2003, 09h55
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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