web-dev-qa-db-fra.com

Contrôler la souris en écrivant dans/dev/input/mice

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++.

27
Vishal

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

trouvé ici

35
Jappie Kerk

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;
}
15
Raydel Miranda

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. 

Comment contrôler les mouvements de la souris sous Linux?

10
tuxdna

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.

5
nopper

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 devrez ajuster event8 sur le périphérique de saisie de la souris de votre système. Utilisez cette commande pour trouver: cat/proc/bus/input/devices
  • Vous devez disposer d'une autorisation suffisante (éventuellement root) pour écrire sur le périphérique d'entrée.
  • J'ai supposé l'architecture de processeur little-endian (d'où l'inversion d'octet avec Perl).
3
Ruud Helderman

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.

0
chnyda

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).

0