Как установить положение курсора мыши в C на Linux? - PullRequest
21 голосов
/ 12 марта 2010

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

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

#include <curses.h>

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

Ответы [ 6 ]

33 голосов
/ 12 марта 2010

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.
11 голосов
/ 25 июля 2010

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

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

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

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

3 голосов
/ 24 сентября 2014

используйте отличную утилиту Джордана Сисселя 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;
}
3 голосов
/ 12 марта 2010

Вы можете использовать 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 голосов
/ 12 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...