2011-10-06 32 views
10

私はLinuxでマウスを操作しようとしています。 Xlibは作品に思えるが、私はOpenCVのとそれを使用しようとすると、それが戻って保持します:Linuxでのマウスの動きを制御する方法は?

Resource temporarily unavailable 

だから私は「は/ dev/COM1にあたるシリアルポート1 psaux」を書くことにしました。

#include <unistd.h> 
#include <string.h> 
#include <stdio.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 


int main() { 
    unsigned char a[5]={0, 0xff, 0, 0x28, 0xff}; 
    int fp = open ("/dev/psaux", O_WRONLY); 
    if(!fp)printf("open error:%s\n", strerror(errno)); 
    for(int i = 0; i < 10; i++) 
     printf("write:%d\t\t%s\n", write(fp, a, 5), strerror(errno)); 
    close(fp); 
    return 0; 
} 

はでそれをコンパイルします:

gcc my_psaux.c -o my_psaux -std=gnu99 -g 

ランとマウスが動かないしかし

$sudo ./my_psaux 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 

を取得するコードは以下の通りです。新しい端末を開き、 "sudo cat/dev/psaux"と入力して "my_psaux"を実行します。 しかし、私はただ猫を飼っていません。 "/ dev/psaux"には何も書き込まれていませんか?

誰でもお手伝いできますか?

これはマウスを制御する良い方法ではない場合は、誰かに私にもう1つ教えてもらえますか?

+4

を使用すると、物理的に移動するためにマウスを期待している場合を除き、私はPS/2ポートへの書き込みとは思わない、それを行うための正しい方法です...あなたのコメントを – Blindy

+0

ありがとう:次はようなコードがあります。私はそう思っていました。しかし、@ R ..と同じように、_itはterminal_のようなものです。言い換えれば、まだマウスに到達していません。 – thundertrick

+0

私はそれを疑う、あなたはまだ聞こえる*非常に*混乱して... – Blindy

答えて

13

大感謝.. 代わり/dev/psaux

のいくつかの他の方法を私に思い出させるためにだから私は、私はこれを取得

cat /proc/bus/input/devices 

を使用することにより/dev/input/mouse*/dev/input/event*

を試してみました:

I: Bus=0003 Vendor=0461 Product=4d81 Version=0111 
N: Name="USB Optical Mouse" 
P: Phys=usb-0000:00:1d.0-1/input0 
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb6/6-1/6-1:1.0/input/input10 
U: Uniq= 
H: Handlers=mouse2 event10 
B: EV=17 
B: KEY=70000 0 0 0 0 0 0 0 0 
B: REL=143 
B: MSC=10 

テスト後、/dev/input/event10のみが動作します。

#include <stdio.h> 
#include <unistd.h> 
#include <linux/input.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/time.h> 

int main() { 
    struct input_event event, event_end; 

    int fd = open("/dev/input/event10", O_RDWR); 
    if (fd < 0) { 
    printf("Errro open mouse:%s\n", strerror(errno)); 
    return -1; 
    } 
    memset(&event, 0, sizeof(event)); 
    memset(&event, 0, sizeof(event_end)); 
    gettimeofday(&event.time, NULL); 
    event.type = EV_REL; 
    event.code = REL_X; 
    event.value = 100; 
    gettimeofday(&event_end.time, NULL); 
    event_end.type = EV_SYN; 
    event_end.code = SYN_REPORT; 
    event_end.value = 0; 
    for (int i=0; i<5; i++) { 
    write(fd, &event, sizeof(event));// Move the mouse 
    write(fd, &event_end, sizeof(event_end));// Show move 
    sleep(1);// wait 
    } 
    close(fd); 
    return 0; 
} 
2

マウスはループバック/エコーデバイスではありません。それは端末のようなものです。同じ文字が入力としてあなたに戻ってくるように(画面に表示される)端末にデータを書き込むことを期待しますか?同じことがマウスに当てはまります。それを書く際の唯一のポイントは、そのモード(例えば、使用されるプロトコルまたは解像度)を変更するエスケープシーケンスを送ることである。

マウスを「制御する」場合は、入力システムが読み込むために、/dev/psauxの代わりにfifo(名前付きパイプ)またはpseudo-ttyを入力する必要があります。しかし、これはおそらく誤ったやり方で行われています...

なぜマウスを制御する必要があるのか​​説明すれば、あなたがしようとしていることに対するより良い代替アプローチを提供することができます。 @Rへ

+0

お返事ありがとうございます。パイプは良いアイデアです。私はマウスの動きを制御するために(kinectのような)何かをしようとしています。 Xlibは試行されましたが失敗しました。なにか提案を? – thundertrick

+0

@R ..あなたが答えたものとは対照的に、/ dev/input/event *デバイスは実際にデバイスがサポートしているイベントに準拠している場合は、それらに書き込むものをエコーし​​ます。/dev/input/event *デバイスへのwrite()コールは、イベントがデバイス自体から来たものとして、書き込まれたイベントを注入します。http://lxr.free-electrons.com/source/drivers/input/evdevを参照してください。 .c#L457 – fons

+0

興味深い。私はこれを確認していませんが、evdev固有の動作のようです。確かに 'psaux'デバイスノードはそのように動作しませんでした。デバイス設定(dpiなど)を制御するコマンドをマウスに書き込むことができました。 –

関連する問題