Ubuntu 12.04を使用しています。私のアプリケーションの1つでは、スクリプトを使用してソフトウェアでマウスを制御する必要があります。
マウスデバイスが/dev/input/mice
であることを理解しています。 cat /dev/input/mice
を実行してからマウスを動かすと、多くの出力が画面にダンプされます。
ここで、マウスを削除して、マウスポインターを制御するために/dev/input/mice
に書き込むスクリプトを作成したい
次のコマンドを手伝ってください:
(1)左クリックを実行します
(2)右クリックを実行します
(3)マウスをある場所から別の場所に移動します。
C/C++ソリューションではなく、シェルスクリプトソリューションを探しています。
これは、あなたが言及したファイルの谷ではありませんが、そのファイルのダンプを解読する代わりにこのツールを使用する方が迅速です。そして、それはあなたが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
勇気があり、サードパーティのツールに依存したくない場合は、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;
}
/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では、マウス、キーボード、その他の種類の入力デバイスをエミュレートするための適切なモジュールがあります。モジュールはuinput
と呼ばれ、ユーザースペース入力を表します。
ソフトウェアを介して制御される仮想デバイスを簡単に作成できます。たとえば、Pythonを知っている場合は、 python-uinput を使用して仮想マウスをセットアップし、move here、clickclick。たとえば、ドキュメントに従ってマウスを移動するには:
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 を見て、マウス/タッチパッドの移動操作を実装するためのリファレンスを取得できます。
私を正しい方向に導いたのは、以前の投稿の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
警告:
仮想マウスを作成できます。
他にも述べたように、事前に作成されたツールを使用できます。しかし、uinputで遊ぶのは面白いかもしれません。
http://thiemonge.org/getting-started-with-uinput
基本的には、仮想デバイスを作成するだけです。そして/ dev/uinputに書き込みます。
/ dev/input/miceを使用してマウスを制御することに加えて、パッケージ 'xautomation'からコマンド 'xte'を使用できます。
apt-get install xautomation
例として、次のコマンドに注目できます。
xte 'mousemove 400 100'
そのため、マウスポインターは画面の特定の場所に移動します。他の例として、次のものがあります。
xte 'mouseclick 1'
マウスの左ボタンをクリックします(1:左クリック、2:中クリック、3:右クリック)。