2013-12-15 127 views
18

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

マウスデバイスは/dev/input/miceです。 cat /dev/input/miceを実行してマウスを動かすと、出力が画面にダンプされるのが見えます。

は今、私は

次のためのコマンドで私を助けてくださいマウスを削除し、マウスポインタを制御するために/dev/input/miceへの書き込みを行うスクリプトを持つことを望む:
は (1)左クリックを実行し
(2)右クリックを実行する
(3)ある場所から別の場所にマウスを移動します。

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

+0

[mac端末でマウスクリックをシミュレートするにはどうすればよいですか?](http://stackoverflow.com/questions/4230867/how-do-i-simulate-a-mouse-click-through-the -mac-terminal) – davidcondrey

答えて

28

これはあなたが言及したファイルではなく、そのファイルをダンプしないでこのツールを使用する方が速くなります。そして、あなたが望むものはすべてbashでやります。

xdotoolは私の端末で騙されます。
thisは、ubuntuのパッケージサイトです。 あなたは、おそらくそれは、私はただのリポジトリを追加することなく、Gentooの上に出てくる可能性が

# apt-get install xdotool 

トラフインストールすることができます。
the tool works fairly simple:あなたは勇敢であり、あなたが任意のサードパーティ製のツールに依存したくない場合は

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

found it here

+0

実際には、私はAndroidデバイスで同じことを試すことができるように、直接的な解決策が必要でした。ソリューションでは別のツールを使用します。私は正しい答えとしてそれを受け入れることはできません。とにかくありがとう... – vishal

+1

@vishalこれはあなたの質問に記載されていません...あなたはubuntuを使用したと言いました。とにかくこの質問はアンドロイドのキー入力に関するものです:http://stackoverflow.com/questions/18244693/android-simulate-a-physical-button-press-of-keyboard-inputまた、アンドロイドはxサーバを使用しないことに注意してくださいここで:http://stackoverflow.com/questions/4579573/android-graphics-internals入力デバイスを操作することはおそらくubuntuと同じではありません。また、アンドロイドにはgnuが含まれていません。これはほとんどのLinuxデスクトップディストリビューションの最上位です。http://www.gnu.org/philosophy/android-and-users-freedom.html第5段落 –

+0

実際に私は完全にはなかったことに同意します"/ dev/input/miceへの書き込み"という質問をすることで、解決策がAndroidに移植可能であることを期待しました。あなたの参考に感謝、彼らは私には、Android上で何を期待するかについての多くの手がかりを与える。 – vishal

11

、あなたはXlibのを使用する必要があります。ドキュメントはhereです。また、C/C++を混乱させたくない場合は、python-xlibを試すこともできます。

例(C/C++)はthreadをご確認ください。

これは、coordを受け取り、その位置でマウスクリックをシミュレートするプログラムの例です。

#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; 
} 
+0

これはサードパーティのツールであるXに依存します:)。 'uinput'と話すことは、カーネル自体と対話しています。また、私はこのスニペットを私のアプリケーションのために完全に盗んでいます! –

+0

@étale-cohomology、私はあなたがそれを使用できることをうれしく思っています! –

7

あなたは/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コードの助けを借りることができます:あなたがいることをしたら

Get mouse deltas using Python! (in 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を使用してバイナリ値をエンコードするには、次の

Passing binary data as arguments in bashしかし私が試したと/dev/input/miceへの書き込みは動作しません。

この理由は、このファイルは、すでに発生したイベントのストリームのみを提供しているからです。そのようなイベントを注入するには、他の方法が必要です。

How to control mouse movement in linux?

+0

'/ dev/input/mice'ではなくマウスのイベントである'/dev/input/eventX'に書き込もうとしましたか?私はAndroidの 'sendevent.c'(https://github.com/android/platform_system_core/blob/master/toolbox/sendevent.c)がそうしているからです。適切なイベントファイルに書き込むことで電源ボタンをエミュレートできます。これはコードです - http://stackoverflow.com/a/17552162/1154689 –

+0

cat/dev/input/miceに感謝します。 od -t x1 -w3 – Matical

3

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のキーボードを介して制御することができるマウスエミュレータを作成しました。マウス/タッチパッドの移動操作を実装するために、私のcodeを参照することができます。

+0

+1はXorgに依存しません。この例を得るには、私はuinputをmodprobeしなければなりませんでした。マウスイベントを発行する前に 'time.sleep(1)'を追加し、rootとしてスクリプトを実行するか、自分自身をuinputグループに追加してください – siikamiika

2

それは右のトラックに私を置く以前の記事のいずれかで、このハイパーリンクだった: How to control mouse movement in Linux

様々な他の場所からの情報に助けが、私はbashスクリプトに移植するCのサンプル・コードを管理していました。

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を調整する必要があります

  • ここでマウスが右に100個のピクセルをカーソル移動させたPoCです。 cat/proc/bus/input/devices
  • 入力デバイスに書き込むためには、十分な権限(rootでも可)が必要です。
  • 私はリトルエンディアンのプロセッサアーキテクチャを想定していました(したがって、Perlでのバイト反転)。
0

マウスを制御するために/ dev/input/miceを使用するだけでなく、パッケージ 'xautomation'からコマンド 'xte'を使用することもできます。例として

apt-get install xautomation 

、次のコマンドが注目される。

xte 'mousemove 400 100' 

したがって、マウスポインタが画面の特定の位置に移動します。他の例として、我々は持っている:

xte 'mouseclick 1' 

マウスの左ボタンをクリックすると、その(:左クリック、2:中クリック、3:1を右クリックしてください)。

0

仮想マウスを作成できます。

他にも既成のツールを使用できます。 しかし、それはuinputで遊ぶのが面白いかもしれません。

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

基本的にはあなただけの仮想デバイスを作成する必要があります。 そして、/ dev/uinputに書き込んでください。

関連する問題