我如何在Linux下使用C程序在X窗口中设置鼠标光标的位置? 谢谢:)(如WIN中的setcursorpos())
编辑:我试过这段代码,但不起作用:
#include <curses.h> main(){ move(100, 100); refresh(); }
12.4 – 移动指针
尽管指针的移动通常应该由最终用户来控制,但是有时在程序控制下有必要将指针移动到新的位置。
要将指针移动到窗口中的任意点,请使用XWarpPointer() 。
例:
Display *dpy; Window root_window; dpy = XOpenDisplay(0); root_window = XRootWindow(dpy, 0); XSelectInput(dpy, root_window, KeyReleaseMask); XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, 100, 100); XFlush(dpy); // Flushes the output buffer, therefore updates the cursor's position. Thanks to Achernar.
这是旧的,但万一有人遇到这个问题。 tusbar提供的答案是正确的,但必须在最后添加命令XFlush(dpy)来更新光标的位置。 需要的库有:X11 / Xh,X11 / Xlib.h,X11 / Xutil.h。
int main(int argc, char *argv[]){ //Get system window Display *dpy; Window root_window; dpy = XOpenDisplay(0); root_window = XRootWindow(dpy, 0); XSelectInput(dpy, root_window, KeyReleaseMask); XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, 100, 100); XFlush(dpy); return 0;}
您要编写一个X11程序 ,使用调用XWarpPointer
函数将该点移动到相对或全局位置。 (Xlib编程手册,第1卷)
一般来说,使用Xlib来编程X Window系统,是在Unix或Linux系统上进行图形编程的最基本和最底层的接口。 现在开发的大多数应用程序都使用更高级别的库(如GTK或Qt)来开发GUI应用程序。
Curses或NCurses(New Curses)用于编程面向终端的接口,所以在这种情况下是没有用的。
您可以使用XWarpPointer在X窗口中移动鼠标光标。
XWarpPointer(display, src_w, dest_w, src_x, src_y, src_width, src_height, dest_x, dest_y) Display *display; Window src_w, dest_w; int src_x, src_y; unsigned int src_width, src_height; int dest_x, dest_y;
使用Jordan Sissel的优秀实用程序xdotool。
http://www.semicomplete.com/projects/xdotool/
它提供了像xdo_mousemove()这样的XWarpPointer包装函数,下面是一些例子:
Display *display = NULL; xdo_t *xdo = NULL; void mouse_left_down(int x, int y) { xdo_mousemove(xdo, x, y, 0) xdo_mousedown(xdo, CURRENTWINDOW, Button1); } void mouse_left_up(int x, int y) { xdo_mouseup(xdo, CURRENTWINDOW, Button1, 1, 0); } void mouse_left_double_click(int x, int y) { xdo_mousemove(xdo, x, y, 0); xdo_click_multiple(xdo, CURRENTWINDOW, Button1, 1, 0); doubleclick = TRUE; } int main() { display = XOpenDisplay(NULL); if(display == NULL) { fprintf(stderr, "can't open display!\n"); return -1; } xdo = xdo_new((char*) display); //some task here // ... return 0; }
所有的现代终端都应该支持ANSI转义序列 。 对于任何更复杂(更便携)的东西,你应该使用一个库,比如ncurses 。