如何在Linux上用C设置鼠标指针位置?

22

如何在Linux下使用C程序设置X窗口中的鼠标光标位置? 感谢 :) (类似于WIN中的setcursorpos())

编辑: 我尝试了这段代码,但没有成功:

#include <curses.h>

main(){
 move(100, 100);
 refresh();
}

3
你的光标位置是在哪里?在 X 窗口吗?终端窗口?还是在 vi 编辑器中? - T.J. Crowder
在X窗口中...但我不需要获取光标位置,我需要在屏幕上的任何地方设置它。 - frx08
你看到了具体性的价值。 :-) 现在你有三个完全与问题无关的答案(它们都是关于在终端窗口中设置光标位置的)。 - T.J. Crowder
谢谢,但我不知道是否解释清楚了,我需要以编程方式移动鼠标。 - frx08
在X Window System中,鼠标“光标”指的是图形图标,而您似乎想要移动鼠标“指针”本身(这将同时移动“热点”以及光标图标)。 - mctylr
将标题编辑为指向鼠标光标。(我在搜索设置终端光标位置时偶然发现了这个。) - Calmarius
6个回答

33

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.

谢谢,但它不起作用:我将XWarpPointer的第二个参数从NULL编辑为None,编译时没有错误,但光标不移动。 - frx08
它对我也没有编译,我认为这是因为缺少库。我尝试包含@Achernar提到的库,但我的编译器仍然找不到对XOpenDisplay和其他库调用的引用。我将它们包含如下(显然,不是一行,但我在格式化我的评论时遇到了麻烦): #include <stdio.h> #include <X11/X.h> #include <X11/Xlib.h> #include <X11/Xutil.h> 有什么想法吗? - Seanny123
1
原来编译时必须确保链接 X 库。gcc text.cpp -lX11 -o t - Seanny123

14

这篇文章已经有点老了,但如果有其他人遇到类似的问题,我想说: tusbar 提供的答案是正确的,但必须在最后加入 XFlush(dpy) 命令以更新光标位置。所需库文件为: X11/X.h,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;}

提示:你可以使用这个命令来构建代码 gcc main.c -lX11


5
您想编写一个X11程序,使用调用XWarpPointer函数来将点移动到相对或全局位置。 (Xlib编程手册,第1卷)
一般而言,在Unix或Linux系统上编程X Window System时,使用Xlib是最基本且相当低级的图形编程接口。现今大多数应用程序使用更高级别的库,例如GTKQt来开发其GUI应用程序。
Curses或NCurses(New Curses)用于编程面向终端的界面,因此在此情况下不是有用的。

4

使用Jordan Sissel的优秀实用工具xdotool。

http://www.semicomplete.com/projects/xdotool/

它提供了XWarpPointer包装函数,如xdo_mousemove(),以下是一些示例:

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

1
xdo_mousemove() -> xdo_move_mouse() https://github.com/jordansissel/xdotool/blob/master/xdo.h#L238 - Lucas Walter

3
您可以使用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;

2

所有现代终端都应支持ANSI转义序列。但是,如果需要更复杂(且更可移植)的功能,则应考虑使用诸如ncurses之类的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接