L’envoi d’un événement de clic X11 ne fonctionne pas avec certaines fenêtres

L’extrait de code suivant fonctionne la plupart du temps, sauf dans certaines fenêtres. Par exemple, sous la dernière Ubuntu, cela ne fonctionne pas pour la sélection de dossiers dans l’explorateur de fichiers. Cela semble fonctionner à peu près partout ailleurs, mais cet écart est important. Je soupçonne que cela a à voir avec ma façon d’utiliser XQueryPointer, mais j’ai essayé presque tous les exemples que je peux trouver. Si j’utilise plutôt la souris de l’ordinateur, tout va bien. FYI: J’ai déjà essayé les réponses à ces questions: Envoi d’événements programmatiques Capuring Mouse Input mais ils ne fonctionnent pas différemment …

Voici le code:

#include  #include  #include  void SendClick(int button, int down) { Display *display = XOpenDisplay(NULL); XEvent event; if(display == NULL) { return; } memset(&event, 0, sizeof(event)); event.xbutton.button = button; event.xbutton.same_screen = True; event.xbutton.subwindow = DefaultRootWindow (display); 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); } event.type = down ? ButtonPress : ButtonRelease; XSendEvent(display, PointerWindow, True, down ? ButtonPressMask : ButtonReleaseMask, &event); XFlush(display); XCloseDisplay(display); } 

Merci au commentaire de ninjalj ci-dessus pour m’avoir mis sur la bonne voie. Je n’aime pas l’idée de s’appuyer sur une extension pour le faire et la dépendance supplémentaire qu’elle crée, mais c’est aussi une extension assez standard. Fonctionne parfaitement …

Pour ceux qui rencontrent le même problème que moi, le bloc de code suivant remplace le code que j’utilisais auparavant et fonctionne bien:

 #include  void SendClick(int button, Bool down) { Display *display = XOpenDisplay(NULL); XTestFakeButtonEvent(display, button, down, CurrentTime); XFlush(display); XCloseDisplay(display); } 

Plus court!

Pour Ubuntu, n’oubliez pas d’installer le paquet libxtst-dev. Assurez-vous d’append -lXtst à vos LDFLAGS.

Ce lien est également utile:

Génération d’événements de souris X11 à l’aide de l’extension XTest http://bharathisubramanian.wordpress.com/2010/04/01/x11-fake-mouse-events-generation-using-xtest/

Voici un lien expliquant comment utiliser l’extension XTest pour la génération de faux événements de clavier:

Génération d’événements de clé X11 à l’aide de l’extension XTest http://bharathisubramanian.wordpress.com/2010/03/14/x11-fake-key-event-generation-using-xtest-ext/