1
Предположим, что я знаю идентификатор окна. Тогда я могу послать мыши к окну таким образом (это окно на весь экран так корневые и оконные координаты совпадают):x11 - отправка щелчка мыши без перемещения указателя
Display *display = XOpenDisplay(NULL);
if(display == NULL)
{
std::cout<<"Cannot open display"<<std::endl;
exit(EXIT_FAILURE);
}
XWarpPointer(display, None, RootWindow(display, DefaultScreen(display)), 0, 0, 0, 0, 300, 200);
XEvent event;
memset(&event, 0x00, sizeof(event));
event.type = ButtonPress;
event.xbutton.button = button;
event.xbutton.same_screen = True;
event.xbutton.root = RootWindow(display, DefaultScreen(display));
event.xbutton.window = 75497473;
event.xbutton.subwindow = 0;
event.xbutton.x_root = 300;
event.xbutton.y_root = 200;
event.xbutton.x = 300;
event.xbutton.y = 200;
event.xbutton.state = 0;
XSendEvent(display, PointerWindow, True, ButtonPressMask, &event) == 0)
XFlush(display);
usleep(100000);
event.type = ButtonRelease;
event.xbutton.state = 0x100;
XSendEvent(display, PointerWindow, True, ButtonReleaseMask, &event) == 0)
XFlush(display);
Этот код не работает, если я удалю:
XWarpPointer(display, None, RootWindow(display, DefaultScreen(display)), 0, 0, 0, 0, 300, 200);
Я не использую XQueryPointer, поэтому я не понимаю, где проблема. Можно ли направить щелчок мыши без использования XWarpPointer?
Если изменить положение х/у в XWarpPointer, где имеет место пресса события мыши? На (300,200) или в позиции, предоставленной XWarpPointer? Кроме того, вы устанавливаете event.xbutton.state в 0 для ButtonPressEvent, указывая, что кнопка не была нажата. Наконец, вы используете жестко закодированное значение «0x100» для ButtonRelease; не делайте этого, используйте константы Button * Mask (см. http://www.tronche.com/gui/x/xlib/events/keyboard-pointer/keyboard-pointer.html) – JvO