通过写入/ dev / input / mice来控制鼠标

我正在使用Ubuntu 12.04。 对于我的一个应用程序,我需要使用脚本在软件中控制鼠标

我明白,鼠标设备是/dev/input/mice 。 如果我做一个cat /dev/input/mice ,然后移动我的鼠标,我看到很多输出被转储到屏幕上。

现在我想删除鼠标,并有一个脚本写入/dev/input/mice mouse为了控制鼠标指针

请帮助我使用以下命令:
(1)执行左键单击
(2)执行右键单击
(3)将鼠标从一个位置移动到另一个位置。

请注意,我正在寻找一个shell脚本解决scheme,而不是一个C / C ++解决scheme。

Solutions Collecting From Web of "通过写入/ dev / input / mice来控制鼠标"

这不是通过你提到的文件,但它的方式更快地使用这个工具,而不是decypering该文件的转储。 它在bash中做你想做的一切。

xdotool在我的终端中诀窍。
这是Ubuntu的软件包网站。 你可能可以安装它槽

 # apt-get install xdotool 

我可以刚刚在gentoo上出现它,而不添加任何存储库。
该工具工作相当简单 :

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

在这里找到它

如果你是勇敢的,而且你不想依赖任何第三方工具,你应该使用Xlib。 文档可以在这里找到。 你也可以尝试python-xlib,如果你不想乱用C / C ++的话。

检查这个线程的例子(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的鼠标移动?

有一个适当的模块来模拟鼠标,键盘和其他类型的输入设备在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,带有破损的触摸板。 你可以看看我的代码 ,以实现鼠标/触摸板移动操作的参考。

在之前的文章中,这个超链接使我走上了正确的轨道: 如何在Linux中控制鼠标移动

通过来自其他地方的信息,我设法将C示例代码移植到Bash脚本中。 这是一个PoC,将鼠标光标向右移动100像素:

 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的字节逆转)。

除了使用/ dev / input / mouse来控制你的鼠标外,你可以使用'xautomation'包中的'xte'命令。

 apt-get install xautomation 

作为一个例子,可以注意到以下命令:

 xte 'mousemove 400 100' 

所以,鼠标指针移动到屏幕的特定位置。 作为另一个例子,我们有:

 xte 'mouseclick 1' 

点击鼠标左键(1:左键,2:中键,3:右键)。

您可以创建一个虚拟鼠标。

正如其他提到的,你可以使用预制的工具。 但是玩一下输入可能会很有趣。

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

基本上你只需要创建一个虚拟设备。 并写入/ dev / uinput。