как я могу установить положение курсора мыши в окне X с помощью программы C под Linux? благодаря:) (например, setcursorpos() в WIN)
EDIT: Я пробовал этот код, но не работает:
#include <curses.h>
main(){
move(100, 100);
refresh();
}
как я могу установить положение курсора мыши в окне X с помощью программы C под Linux? благодаря:) (например, setcursorpos() в WIN)
EDIT: Я пробовал этот код, но не работает:
#include <curses.h>
main(){
move(100, 100);
refresh();
}
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.
Это старый, но в случае, если кто-то другой сталкивается с этой проблемой. Ответ, предоставленный 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;}
Вы хотите написать программу X11, которая использует вызов XWarpPointer
, чтобы переместить точку в относительную или глобальную позицию. (Руководство по программированию Xlib, том 1)
В общем, использование Xlib для программирования X Window System - это самый простой и довольно низкоуровневый интерфейс для графического программирования в системе Unix или Linux. Большинство приложений, разработанных в настоящее время с использованием библиотеки более высокого уровня, например GTK или Qt для разработки своих графических приложений.
Curses или NCurses (New Curses) предназначены для программирования терминально-ориентированных интерфейсов, поэтому в этом случае они не являются полезными.
Вы можете использовать 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;
используйте 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;
}
Все современные терминалы должны поддерживать ANSI escape-последовательности. Однако для чего-либо более сложного (и более портативного) вам нужно изучить библиотеку, такую как ncurses.