Управляйте мышью путем записи в/dev/input/mice

Я использую Ubuntu 12.04. Для одного из моих приложений мне нужно управлять мышью в программном обеспечении с помощью script.

Я понимаю, что устройство мыши /dev/input/mice. Если я делаю cat /dev/input/mice, а затем перемещаю мышь, я вижу, что на экран выводится большое количество выходных данных.

Теперь я хочу удалить мышь и иметь script, который пишет в /dev/input/mice, чтобы управлять указателем мыши

Пожалуйста, помогите мне с командами для следующего:
(1) Выполнить левый клик
(2) Выполните правое нажатие
(3) Переместите мышь из одного места в другое.

Обратите внимание, что я ищу решение оболочки script, а не решение C/С++.

+17
источник поделиться
7 ответов

это не через файл, который вы упомянули, но его способ быстрее использовать этот инструмент, а не дешифровать дамп этого файла. И он делает все, что вам нужно, в bash.

xdotool делает трюк в моем терминале.
это - сайт пакета для ubuntu. вы, вероятно, можете установить его через

# apt-get install xdotool

Я мог бы просто создать его на gentoo без добавления каких-либо репозиториев. инструмент работает довольно просто:

#! /bin/bash
# move the mouse  x    y
xdotool mousemove 1800 500
# left click
xdotool click 1
# right click
xdotool click 3

нашел его здесь

+27
источник

Если вы храбры, и вы не хотите зависеть от стороннего инструмента, вы должны использовать Xlib. Документацию можно найти здесь. Также вы можете попробовать python-xlib, если вы не хотите связываться с C/С++.

Проверьте этот поток для примера (C/С++).

Это пример программы, которая получает координату и имитирует щелчок мышью в этой позиции.

#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;
}
+11
источник
другие ответы

Связанные вопросы


Похожие вопросы

Вы можете записывать события с помощью инструмента od из /dev/input/mice, а затем воспроизводить их, как только вы декодировали последовательность.

# 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

Для этого вы можете воспользоваться здесь кодом python:

Получить дельта мыши с помощью Python! (в 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

После этого вы можете закодировать его обратно в 3 байтовую последовательность для каждого перемещения мыши.

Чтобы закодировать двоичные значения с помощью bash, вы можете обратиться к этому вопросу: Передача двоичных данных в качестве аргументов в bash

Однако Я пробовал, и запись в /dev/input/mice не работает.

Причина в том, что этот файл предоставляет только те потоки событий, которые уже произошли. Таким образом, должен быть какой-то другой способ ввести такие события.

Как управлять движением мыши в Linux?

+7
источник

Там есть соответствующий модуль для эмуляции мыши, клавиатуры и других устройств ввода в Linux. Модуль называется uinput, который обозначает ввод пользовательского пространства.

Вы можете легко создавать виртуальные устройства, управляемые с помощью программного обеспечения. Например, если вы знаете Python, вы можете настроить виртуальную мышь с помощью python-uinput и выпустить простые команды, например, переместить сюда, щелкнуть там, Например, чтобы переместить мышь, в соответствии с документацией:

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)

Я никогда не использовал эту привязку, но несколько лет назад я создал эмулятор мыши, который можно контролировать с помощью клавиатуры для моей iBook, которая поставляется с сломанной сенсорной панелью. Вы можете взглянуть на мой код, чтобы иметь ссылку, чтобы реализовать операцию перемещения мыши/сенсорной панели.

+3
источник

Именно эта гиперссылка в одном из ранних сообщений помещала меня на правильный путь: Как управлять движением мыши в Linux

Помогая информации из разных мест, мне удалось сопоставить код образца C с Bash script. Здесь находится PoC, который перемещает курсор мыши на 100 пикселей вправо:

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

Предостережения:

  • Вам нужно будет настроить event8 на все, что есть на вашем системном устройстве ввода. Используйте эту команду, чтобы узнать: cat/proc/bus/input/devices
  • Для ввода на устройство ввода требуется достаточное разрешение (возможно, root).
  • Я предположил архитектуру процессора с маленькими концами (отсюда и обращение байта с Perl).
+2
источник

В дополнение к использованию /dev/input/mice для управления мышью вы можете использовать команду "xte" из пакета "xautomation".

apt-get install xautomation

В качестве примера можно отметить следующую команду:

xte 'mousemove 400 100'

Таким образом, указатель мыши перемещается в определенное место на экране. В качестве другого примера мы имеем:

xte 'mouseclick 1'

которые нажимают левую кнопку мыши (1: левый клик, 2: средний щелчок, 3: правый щелчок).

0
источник

Вы можете создать виртуальную мышь.

Как уже упоминалось, вы можете использовать готовые инструменты. Но смешно играть с uinput.

http://thiemonge.org/getting-started-with-uinput

В основном вам просто нужно создать виртуальное устройство. И напишите в/dev/uinput.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос