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 :

[Xlib] Simuler un clic gauche


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut [Xlib] Simuler un clic gauche
    Bonjour, je souhaiterai créer un programme qui me simule un clique gauche grace à l'utilisation de XLib.

    J'ai trouvé une portion de code qui semble convenir mais il y a plusieurs choses que je ne comprend pas .

    Tout d'abord le code.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #include <unistd.h>
     
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
     
    void mouseClick(int button)
    {
    	Display *display = XOpenDisplay(NULL);
     
    	XEvent event;
     
    	if(display == NULL)
    	{
    		fprintf(stderr, "Errore nell'apertura del Display !!!\n");
    		exit(EXIT_FAILURE);
    	}
     
    	memset(&event, 0x00, sizeof(event));
     
    	event.type = ButtonPress;
    	event.xbutton.button = button;
    	event.xbutton.same_screen = True;
     
    	XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
     
    	event.xbutton.subwindow = event.xbutton.window;
     
    	while(event.xbutton.subwindow)
    	{
    		event.xbutton.window = event.xbutton.subwindow;
     
    		XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
    	}
     
    	if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
     
    	XFlush(display);
     
    	usleep(100000);
     
    	event.type = ButtonRelease;
    	event.xbutton.state = 0x100;
     
    	if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
     
    	XFlush(display);
     
    	XCloseDisplay(display);
    }
    Et ensuite les questions

    • Pourquoi utilise t on memset ? Je pense que c'est pour s'assurer que la structure ne contienne pas de données non prévues mais j'aimerai confirmation .
    • Je ne comprend pas à quoi sert la boucle while :s


    Merci d'avance et bonne journée

  2. #2
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par geek-59600 Voir le message
    Pourquoi utilise t on memset ? Je pense que c'est pour s'assurer que la structure ne contienne pas de données non prévues mais j'aimerai confirmation .
    Exactement, cela sert à initialiser un bloc de mémoire (ici la structure) avec une valeur connue (ici 0)

    Citation Envoyé par geek-59600 Voir le message
    Je ne comprend pas à quoi sert la boucle while :s
    C'est l'équivalent de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(event.xbutton.subwindow != 0)
    La valeur n'attend pas le nombre des années

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Et dans quel cas event.xbutton.subwindow prend pour valeur 0 ou autre ?

  4. #4
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par geek-59600 Voir le message
    Et dans quel cas event.xbutton.subwindow prend pour valeur 0 ou autre ?
    Là, je ne sais pas, c'est du X11 pur. Par contre, il a l'air d'être modifié par XQueryPointer()
    La valeur n'attend pas le nombre des années

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Je crois avoir compris .

    Le 4eme argument de la fonction XQueryPointer() renvoie un pointeur sur la fenêtre fille sur laquelle se trouve le pointeur de souris. que l'on stocke dans event.xbutton.window; ensuite on stocke celle ci dans event.xbutton.subwindow.

    A ce stade on a donc la même "fenêtre" dans window et subwindow.

    Ensuite on test la valeur de subwindow, si elle est différente de 0 alors il existe peut être une fenêtre fille de la fenêtre fille ; on fait ce test en boucle afin d'avoir l'adresse de la fenêtre la plus "jeune" ( j'ai lu younger window sur un pdf )

    Une fois la boucle finie, event.xbutton.window contient l'adresse de la fenetre la plus jeune et event.xbutton.subwindow doit être null .

    Cependant, je m'étonne de l'absence de test de "event.xbutton.window" aprés le premier XQueryPointer, juste avant la boucle while ; inutilité ou oublie de la personne qui à créer le code ? Je dis ca non pas pour dénigrer loin de la mais j'aimerai savoir si le test était nécessaire ou pas .

    Bonne journée

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/04/2010, 19h49
  2. [JToggleButton] simuler un clic
    Par norkius dans le forum Composants
    Réponses: 4
    Dernier message: 30/05/2005, 17h35
  3. [JTable] Simuler clic gauche après clic droit
    Par Oliveuh dans le forum Composants
    Réponses: 1
    Dernier message: 03/12/2004, 13h35
  4. Popup avec un clic gauche
    Par Jéremy A dans le forum Composants VCL
    Réponses: 7
    Dernier message: 27/02/2003, 23h15
  5. gérer le clic gauche-droite en même temps de la sou
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2002, 23h52

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