Как установить положение курсора мыши в C на linux?

Как я могу установить мышь положение курсора в окне X с помощью программы C под Linux? спасибо :) (как setcursorpos () в WIN)

изменить: Я пробовал этот код, но не работает:

#include <curses.h>

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

6 ответов


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) необходимо добавить в конце, чтобы обновить положение курсора. Необходимые библиотеки: Х11/Х. Ч., Х11/библиотеки 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 (новые проклятия) предназначены для программирования терминально-ориентированных интерфейсов, поэтому не полезны в этом случае.


можно использовать 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;

используйте отличную утилиту xdotool от Jordan Sissel.

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

все современные терминалы должны поддерживать ANSI escape-последовательности. Для чего-то более сложного (и более портативного), однако, вы должны изучить использование библиотеки, такой как ncurses.