J'utilise Ubuntu 12.04. Pour l'une de mes applications, j'ai besoin de contrôler la souris dans un logiciel à l'aide d'un script.
Je comprends que le périphérique de la souris est /dev/input/mice
. Si je fais un cat /dev/input/mice
et que je déplace ensuite ma souris, je vois beaucoup de sorties qui sont affichées à l'écran.
Maintenant, je souhaite supprimer la souris et avoir un script qui écrit dans /dev/input/mice
afin de contrôler le pointeur de la souris
S'il vous plaît, aidez-moi avec les commandes suivantes:
(1) Effectuer un clic gauche
(2) Effectuer un clic droit
(3) Déplacez la souris d’un endroit à un autre.
Veuillez noter que je recherche une solution de script Shell plutôt qu'une solution C/C++.
ce n'est pas par le fichier que vous avez mentionné, mais sa manière plus rapide d'utiliser cet outil au lieu de déchiffrer le dump de ce fichier. Et il fait tout ce que vous voulez en bash.
xdotool fait l'affaire dans mon terminal.
this est le site du paquet pour Ubuntu . vous pouvez probablement l’installer
# apt-get install xdotool
Je pourrais simplement le sortir sur gentoo sans ajouter de référentiels.
l'outil fonctionne assez simple :
#! /bin/bash
# move the mouse x y
xdotool mousemove 1800 500
# left click
xdotool click 1
# right click
xdotool click 3
Si vous êtes courageux et que vous ne voulez pas dépendre d'un outil tiers, vous devriez utiliser Xlib. La documentation peut être trouvée ici . Vous pouvez aussi essayer python-xlib si vous ne voulez pas vous mêler de C/C++.
Vérifiez ce thread pour un exemple (C/C++).
Ceci est un exemple de programme qui reçoit une coordonnée et simule un clic de souris à cette position.
#include <X11/Xlib.h>
#include<stdio.h>
#include<unistd.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, "Error\n");
XFlush(display);
usleep(100000);
event.type = ButtonRelease;
event.xbutton.state = 0x100;
if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n");
XFlush(display);
XCloseDisplay(display);
}
int main(int argc,char * argv[]) {
int i=0;
int x , y;
x=atoi(argv[1]);
y=atoi(argv[2]);
Display *display = XOpenDisplay(0);
Window root = DefaultRootWindow(display);
XWarpPointer(display, None, root, 0, 0, 0, 0, x, y);
mouseClick(Button1);
XFlush(display);
XCloseDisplay(display);
return 0;
}
Vous pouvez capturer les événements à l'aide de l'outil od
à partir du /dev/input/mice
, puis les rejouer une fois que vous avez décodé la séquence.
# cat /dev/input/mice | od -t x1 -w3
0000000 08 02 00
0000003 08 08 00
0000006 08 09 00
0000011 08 07 00
0000014 08 04 00
0000017 08 01 01
0000022 08 00 02
0000025 08 02 02
Pour cela, vous pouvez utiliser le code python ici:
Obtenez les deltas de la souris en utilisant Python! (sous Linux)
L:0, M: 0, R: 0, x: -1, y: -1
L:0, M: 0, R: 0, x: 0, y: -1
L:0, M: 0, R: 0, x: 0, y: -1
L:0, M: 0, R: 0, x: 0, y: 2
L:0, M: 0, R: 0, x: 0, y: 1
L:0, M: 0, R: 0, x: 0, y: -1
L:0, M: 0, R: 0, x: 1, y: -1
Une fois que vous avez cela, vous pouvez le recoder dans une séquence de 3 octets pour chaque déplacement de souris.
Pour encoder les valeurs binaires en utilisant bash
, vous pouvez vous référer à cette question: Passer des données binaires en tant qu'arguments dans bash
Cependant j'ai essayé et écrire à /dev/input/mice
ne fonctionne pas.
La raison en est que ce fichier ne donne que des flux d’événements pour vous qui se sont déjà produits. Donc, il doit y avoir un autre moyen d'injecter de tels événements.
Il existe un module approprié pour émuler souris, claviers et autres types de périphériques d’entrée sous Linux. Le module s'appelle uinput
qui signifie entrée dans l'espace utilisateur.
Vous pouvez facilement créer des périphériques virtuels contrôlés par un logiciel. Par exemple, si vous connaissez Python, vous pouvez configurer une souris virtuelle en utilisant python-uinput et émettre des commandes simples telles que move here, click here. Par exemple, pour déplacer votre souris, conformément à la documentation:
import uinput
device = uinput.Device([uinput.REL_X, uinput.REL_Y])
for i in range(20):
device.emit(uinput.REL_X, 5)
device.emit(uinput.REL_Y, 5)
Je n'ai toutefois jamais utilisé cette reliure, mais il y a plusieurs années, j'ai créé un émulateur de souris pouvant être contrôlé via le clavier de mon iBook livré avec un pavé tactile endommagé. Vous pouvez consulter mon code pour avoir une référence afin de mettre en œuvre l’opération de déplacement de la souris/du pavé tactile.
C’est ce lien hypertexte dans l’un des précédents articles qui m'a mis sur la bonne voie: Comment contrôler le mouvement de la souris sous Linux
À l'aide d'informations provenant de divers autres endroits, j'ai réussi à porter le code exemple C dans un script Bash. Voici une PoC qui déplace le curseur de la souris de 100 pixels vers la droite:
seconds=$(date +%s)
type=2 # EV_REL
code=0 # REL_X
value=100 # 100 pixels
printf '%08X%04X%04X%08X%08X\n' $value $code $type 0 $seconds | xxd -r -p | Perl -0777e 'print scalar reverse <>' > /dev/input/event8
type=0 # EV_SYN
code=0 # SYN_REPORT
value=0
printf '%08X%04X%04X%08X%08X\n' $value $code $type 0 $seconds | xxd -r -p | Perl -0777e 'print scalar reverse <>' > /dev/input/event8
Mises en garde:
Vous pouvez créer une souris virtuelle.
Comme mentionné précédemment, vous pouvez utiliser des outils préconfigurés… Mais il peut être amusant de jouer avec uinput.
http://thiemonge.org/getting-started-with-uinput
En gros, il vous suffit de créer un périphérique virtuel… ..et d'écrire dans/dev/uinput.
En plus d'utiliser/dev/input/mice pour contrôler votre souris, vous pouvez utiliser la commande 'xte' du paquetage 'xautomation'.
apt-get install xautomation
A titre d'exemple, la commande suivante peut être notée:
xte 'mousemove 400 100'
Ainsi, le pointeur de la souris se déplace vers l'emplacement spécifique de l'écran. Comme autre exemple, nous avons:
xte 'mouseclick 1'
cliquez avec le bouton gauche de la souris (1: clic gauche, 2: clic du milieu, 3: clic du bouton droit).