it-swarm.com.ru

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

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

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

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

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

Пожалуйста, обратите внимание, что я ищу решение сценария Shell, а не решение C/C++.

27
Vishal

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

xdotool делает трюк в моем терминале.
this это сайт пакетов для 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

нашел это здесь

35
Jappie Kerk

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

Проверьте это поток для примера (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;
}
15
Raydel Miranda

Вы можете захватывать события, используя инструмент 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?

10
tuxdna

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

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

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, который поставляется со сломанным тачпадом. Вы можете взглянуть на мой код , чтобы получить ссылку для реализации операции перемещения мыши/сенсорной панели.

5
nopper

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

Благодаря информации из разных мест мне удалось перенести пример кода C на скрипт Bash. Вот 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).
3
Ruud Helderman

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

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

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

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

0
chnyda

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

apt-get install xautomation

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

xte 'mousemove 400 100'

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

xte 'mouseclick 1'

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

0
Omidreza Bagheri