web-dev-qa-db-ja.com

/ dev / input / miceに書き込むことでマウスを制御します

Ubuntu 12.04を使用しています。私のアプリケーションの1つでは、スクリプトを使用してソフトウェアでマウスを制御する必要があります。

マウスデバイスが/dev/input/miceであることを理解しています。 cat /dev/input/miceを実行してからマウスを動かすと、多くの出力が画面にダンプされます。

ここで、マウスを削除して、マウスポインターを制御するために/dev/input/miceに書き込むスクリプトを作成したい

次のコマンドを手伝ってください:
(1)左クリックを実行します
(2)右クリックを実行します
(3)マウスをある場所から別の場所に移動します。

C/C++ソリューションではなく、シェルスクリプトソリューションを探しています。

29
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

ここにあります

40
Jappie Kerk

勇気があり、サードパーティのツールに依存したくない場合は、Xlibを使用する必要があります。ドキュメントは こちら にあります。また、C/C++をいじりたくない場合は、 python-xlib を試すことができます。

これを確認してください thread 例(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;
}
16
Raydel Miranda

/dev/input/miceからodツールを使用してイベントをキャプチャし、シーケンスをデコードしたらそれらを再生できます。

# 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 hereclickclick。たとえば、ドキュメントに従ってマウスを移動するには:

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のキーボードで制御できるマウスエミュレーターを作成しました。私の code を見て、マウス/タッチパッドの移動操作を実装するためのリファレンスを取得できます。

5
nopper

私を正しい方向に導いたのは、以前の投稿の1つにあるこのハイパーリンクでした。 Linuxでマウスの動きを制御する方法

他のさまざまな場所からの情報に助けられて、CサンプルコードをBashスクリプトに移植することに成功しました。マウスカーソルを100ピクセル右に移動するPoCは次のとおりです。

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を使用してマウスを制御することに加えて、パッケージ 'xautomation'からコマンド 'xte'を使用できます。

apt-get install xautomation

例として、次のコマンドに注目できます。

xte 'mousemove 400 100'

そのため、マウスポインターは画面の特定の場所に移動します。他の例として、次のものがあります。

xte 'mouseclick 1'

マウスの左ボタンをクリックします(1:左クリック、2:中クリック、3:右クリック)。

0