如何控制在Linux的鼠标移动?

我试图在Linux中控制鼠标。 Xlib似乎工作,但是当我尝试使用OpenCV时,它不断返回:

Resource temporarily unavailable 

所以我决定写“/ dev / 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 

但是鼠标不移动。 然后我打开一个新的terminal,input“sudo cat / dev / psaux”并运行“my_psaux”。 但是我什么都不吃 没有写入“/ dev / psaux”?

任何人都可以帮我吗?

如果这不是控制鼠标的好方法,谁能告诉我另一个?

非常感谢@R ..提醒我一些其他的方式,而不是/dev/psaux

所以我尝试了/dev/input/mouse*/dev/input/event*

通过使用

 cat /proc/bus/input/devices 

我得到这个:

 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; } 

鼠标不是回送/回声设备。 这更像是一个终端。 你会期望写数据到一个终端(这将出现在屏幕上),使相同的字符作为输入回来吗? 这同样适用于鼠标; 写入它的唯一的一点是发送改变其模式的转义序列(例如使用的协议或分辨率)。

如果要“控制”鼠标,则必须以其他方式注入事件,或者为输入系统提供一个fifo(命名管道)或伪tty来替代/dev/psaux 。 然而,这可能是一个相当错误的做事方式…

如果你解释为什么你需要控制鼠标,也许我们可以为你正在尝试做的事情提供更好的替代方法。