linux - guia - qgis español
Controle el mouse escribiendo en/dev/input/mice (7)
Además de usar / dev / input / mice para controlar su mouse, puede usar el comando ''xte'' del paquete ''xautomation''.
apt-get install xautomation
Como ejemplo, se puede observar el siguiente comando:
xte ''mousemove 400 100''
Entonces, el puntero del mouse se mueve a la ubicación específica de la pantalla. Como otro ejemplo, tenemos:
xte ''mouseclick 1''
que haga clic en el botón izquierdo del mouse (1: clic izquierdo, 2: clic medio, 3: clic derecho).
Estoy usando Ubuntu 12.04. Para una de mis aplicaciones necesito controlar el mouse en el software usando una secuencia de comandos.
Entiendo que el dispositivo del mouse es /dev/input/mice
. Si hago un cat /dev/input/mice
y luego muevo el mouse, veo que se está volcando una gran cantidad de salida en la pantalla.
Ahora deseo eliminar el mouse y tener un script que escriba en /dev/input/mice
para controlar el puntero del mouse
Por favor, ayúdenme con los comandos para lo siguiente:
(1) Haga clic con el botón izquierdo
(2) Haga clic con el botón derecho
(3) Mueva el mouse de una ubicación a otra.
Tenga en cuenta que estoy buscando una solución de script de shell, en lugar de una solución de C / C ++.
Fue este hipervínculo en una de las publicaciones anteriores lo que me puso en el camino correcto: cómo controlar el movimiento del mouse en Linux
Ayudado por la información de varios otros lugares, pude portar el código de muestra C a un script Bash. Aquí hay un PoC que mueve el cursor del mouse 100 píxeles hacia la derecha:
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
Advertencias:
- Tendrá que ajustar event8 a cualquier dispositivo de entrada del mouse de su sistema. Use este comando para averiguar: cat / proc / bus / input / devices
- Necesita suficiente permiso (posiblemente raíz) para escribir en el dispositivo de entrada.
- Supuse que la arquitectura del procesador little-endian (de ahí la inversión de bytes con Perl).
Hay un módulo apropiado para emular mouse, teclados y otro tipo de dispositivos de entrada en Linux. El módulo se llama uinput
que significa entrada de espacio de usuario.
Puede crear fácilmente dispositivos virtuales controlados por software. Por ejemplo, si conoce Python, puede configurar un mouse virtual mediante el uso de python-uinput y emitir comandos simples como mover aquí , hacer clic allí . Por ejemplo, para mover el mouse, según la documentación:
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)
Sin embargo, nunca usé ese enlace, pero hace varios años creé un emulador de mouse que se puede controlar a través del teclado de mi iBook que viene con un touchpad roto. Puede echar un vistazo a mi código para tener una referencia para implementar la operación de movimiento del mouse / touchpad.
Puede capturar los eventos usando la herramienta od
de /dev/input/mice
y luego volver a reproducirlos una vez que haya decodificado la secuencia.
# 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
Para esto puedes tomar la ayuda del código python aquí:
¡Obtén deltas de mouse con Python! (en 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
Una vez que tenga eso, puede codificarlo nuevamente en una secuencia de 3 bytes para cada movimiento del mouse.
Para codificar los valores binarios usando bash
, puede referirse a esta pregunta: Pasar datos binarios como argumentos en bash
Sin embargo, lo intenté y escribir en /dev/input/mice
no funciona.
La razón es que este archivo solo le está dando un flujo de eventos que ya han sucedido. Entonces debe haber alguna otra forma de inyectar tales eventos.
Puede crear un mouse virtual.
Como otros mencionados, puedes usar herramientas prefabricadas. Pero puede ser divertido jugar con uinput.
http://thiemonge.org/getting-started-with-uinput
Básicamente solo tienes que crear un dispositivo virtual. Y escriba en / dev / uinput.
Si eres valiente y no quieres depender de ninguna herramienta de terceros, debes usar Xlib. La documentación se puede encontrar aquí . También puedes probar python-xlib si no quieres jugar con C / C ++.
Compruebe este hilo para ver un ejemplo (C / C ++).
Este es un ejemplo de un programa que recibe una coord y simula un clic del mouse en esa posición.
#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;
}
esto no es a través del archivo que mencionaste, pero es mucho más rápido usar esta herramienta en lugar de descifrar el volcado de ese archivo. Y hace todo lo que quieras en bash.
xdotool hace el truco en mi terminal.
este es el sitio del paquete para ubuntu. usted probablemente puede instalarlo a través
# apt-get install xdotool
Podría simplemente surgir en gentoo sin agregar repositorios.
la herramienta funciona bastante simple :
#! /bin/bash
# move the mouse x y
xdotool mousemove 1800 500
# left click
xdotool click 1
# right click
xdotool click 3