Подтвердить что ты не робот

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

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

EDIT: Я пробовал этот код, но не работает:

#include <curses.h>

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

Ответ 1

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 position. Thanks to Achernar.

Ответ 2

Это старый, но в случае, если кто-то другой сталкивается с этой проблемой. Ответ, предоставленный 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;}

Ответ 3

Вы хотите написать программу X11, которая использует вызов XWarpPointer, чтобы переместить точку в относительную или глобальную позицию. (Руководство по программированию Xlib, том 1)

В общем, использование Xlib для программирования X Window System - это самый простой и довольно низкоуровневый интерфейс для графического программирования в системе Unix или Linux. Большинство приложений, разработанных в настоящее время с использованием библиотеки более высокого уровня, например GTK или Qt для разработки своих графических приложений.

Curses или NCurses (New Curses) предназначены для программирования терминально-ориентированных интерфейсов, поэтому в этом случае они не являются полезными.

Ответ 4

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

Ответ 5

используйте 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;
}

Ответ 6

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