本文来自依云's Blog,转载请注明。
最近做一个小工具,需要模拟鼠标点击事件。当然,我可不想去调用 xdotool 或者 xmacro,效率什么不说,光是添加这么个罕见的依赖就不喜欢。顺便也好练习下 C 编程。
Xtest 的函数名长参数列表也长,不过用起来很简单。我所需要调用的函数就两个:
-
XTestFakeMotionEvent
:把鼠标光标移动到指定坐标; -
XTestFakeButtonEvent
:模拟鼠标键
Xtest 的函数手册都在一个 manpage 里。看一下就知道用法了。
XTestFakeMotionEvent
有五个参数,第一个是Display
指针,然后依次是屏幕号、坐标和延时。屏幕号写-1
就是默认了。延时我用0
就好了。XTestFakeButtonEvent
有四个参数,第一个依旧是Display
指针,然后是按键号、是不是按下(还是放开按键)、延时。左键是1
其它依次递加。不知道为什么这些函数要有个延时的参数。
#include<X11/Xlib.h> #include<X11/extensions/XTest.h> /* ... */ int clickAt(int x, int y){ Display *dpy = XOpenDisplay(NULL); if(dpy == NULL){ return 0; } XEvent event; /* get info about current pointer position */ XQueryPointer(dpy, RootWindow(dpy, DefaultScreen(dpy)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state); XTestFakeMotionEvent(dpy, -1, x, y, 0); XTestFakeButtonEvent(dpy, 1, 1, 0); XTestFakeButtonEvent(dpy, 1, 0, 0); /* place the mouse where it was */ XTestFakeMotionEvent(dpy, -1, event.xbutton.x, event.xbutton.y, 0); XCloseDisplay(dpy); return 1; }
这个函数实现了点击指定的屏幕坐标,完事之后再把鼠标光标移回去。最开始是没有移回去的,然后测试的时候我经常找不到鼠标光标了。。。。
C 语言用起来挺不爽的,所以后来做了个 Python 模块。不过功能很不完整,以后有需要时再慢慢加啦。要是谁有兴趣也可以自己加了后给我发 pull request 就更好了。代码地址:https://github.com/lilydjwg/winterpy/blob/master/pyso/X.c,编译命令:
gcc -O2 -shared -lX11 -lXtst `pkg-config --cflags --libs python3` X.c -o X.so
编译后import X
,然后help(X)
就知道用法了。
Sep 22, 2011 10:53:03 AM
你这起名水平有待提高……
Sep 22, 2011 12:09:15 PM
囧。。。