如何在Linux上设置C中的鼠标光标位置?

时间:2010-03-12 14:43:45

标签: c linux pointers position x11

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

编辑: 我尝试过这段代码,但不起作用:

#include <curses.h>

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

6 个答案:

答案 0 :(得分:33)

12.4 - Moving the Pointer

  

虽然指针移动了   通常应该留给控件   最终用户,有时是   将指针移动到新的必要条件   在程序控制下的职位。

     

将指针移动到任意位置   在窗口中指向,使用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.

答案 1 :(得分:11)

答案 2 :(得分:4)

您想要编写一个使用调用X11 program函数的XWarpPointer来将该点移动到相对位置或全局位置。 (Xlib编程手册,第1卷)

通常,使用Xlib对X Window系统进行编程,是Unix或Linux系统上最基本,最低级的图形编程接口。现在大多数应用程序使用更高级别的库(例如GTKQt)来开发GUI应用程序。

Curses或NCurses(New Curses)用于编程面向终端的接口,因此在这种情况下无用。

答案 3 :(得分: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;

答案 4 :(得分:3)

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

答案 5 :(得分:2)

所有现代终端都应支持ANSI escape sequences。但是,对于任何更复杂(更便携)的内容,您应该考虑使用ncurses等库。