本文来自依云'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
囧。。。