LINUX.ORG.RU

Программное управление мышью в x11


1

1

Имеется такой код

// Simulate mouse click
void click (Display *display, int button, int b)
{
	// Create and setting up the event
	XEvent event;
	memset (&event, 0, sizeof (event));
	event.xbutton.button = button;
	event.xbutton.same_screen = True;
	event.xbutton.subwindow = DefaultRootWindow (display);
	while (event.xbutton.subwindow)
	{
		event.xbutton.window = event.xbutton.subwindow;
		XQueryPointer (display, event.xbutton.window,
					   &event.xbutton.root, &event.xbutton.subwindow,
					   &event.xbutton.x_root, &event.xbutton.y_root,
					   &event.xbutton.x, &event.xbutton.y,
					   &event.xbutton.state);
	}

	printf(" ");

	// Press
	if(b) {

		event.type = ButtonPress;
		if (XSendEvent (display, PointerWindow, True, ButtonPressMask, &event) == 0)
			fprintf (stderr, "Error to send the event!\n");
		XFlush (display);
		usleep (1);

		printf("one");

	} else {
		// Release
		event.type = ButtonRelease;
		if (XSendEvent (display, PointerWindow, True, ButtonReleaseMask, &event) == 0)
			fprintf (stderr, "Error to send the event!\n");
		XFlush (display);
		usleep (1);

		printf("two");

	}
}

// Move mouse pointer
void move (Display *display, int x, int y)
{
	XWarpPointer (display, None, DefaultRootWindow(display), 0,0,0,0, x, y);
	XFlush (display);
	usleep (1);
}

int main (int argc, char *argv[])
{
	int x = 1;
	int y = 1;

	// Open X display
	Display *display = XOpenDisplay (NULL);
	if (display == NULL)
	{
		fprintf (stderr, "Can't open display!\n");
		return -1;
	}


	move(display, 500, 700);

	click (display, Button1, 1); // Press

	sleep(1);
	move(display, 550, 800);
	sleep(1);

	click(display, Button1, 0); // Release

	// Close X display and exit
	XCloseDisplay (display);
	return 0;
}

Идея была выделить кусок текста. Но судя по всему происходит клик, но никак не нажатие-передвижение-отжатие. Кто то может объяснить вкратце как работать с этим дерьмом x11. Или подскажите какую то библиотеку/обвертку для работы с x11. Заранее спасибо.

С XFlush не пробовали? На крайний случай третий параметр можно в None выставить, хотя тогда поведение изменится.

quiet_readonly ★★★★ ()

Некоторые программы игнорят искуственные события, возможно столкнешься с такими. Выход - пляски с LD_PRELOAD.

m0rph ★★★★★ ()

см в сторону XTest, это X-овое расширение (включено по дефолту на большинстве дистрибов), позволяет инжектить маус эвенты (и клавиатурные вроде тоже). Правда работает довольно тормознуто, но зато работает на любом приложении :)

qrck ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.