Отправка нажатий клавиш на X Window

В настоящее время я экспериментирую с xdotool для отправки ключей к процессу (я понимаю, что он может не работать для всех процессов, которые не устанавливают _NET_WM_PID). У меня возникли проблемы с отправкой нажатий клавиш в windows, отличные от фокуса. Он работает, если вы посылаете нажатия клавиш на CURRENTWINDOW . Ниже приведен fragment, который я использовал для тестирования функциональности xdotool.

 extern "C"{ #include  } //extern "C" xdo_window_search #include  #include  using namespace std; int main(){ xdo_t* p_xdo = xdo_new(NULL); // Allocate memory for search query. xdo_search_t s; // Clear the allocated memory. memset(&s, 0, sizeof(xdo_search_t)); // Set the search query. s.pid = 1916; s.max_depth = -1; s.searchmask = SEARCH_PID; s.require = xdo_search::SEARCH_ANY; // Allocate memory for output Window* windows; int no_windows; xdo_window_search(p_xdo,&s,&windows,&no_windows); cout << no_windows << endl; // Prints all windows' names with matching criteria for( int i=0;i<no_windows;i++ ){ unsigned char * name; int size; int type; xdo_get_window_name(p_xdo,windows[i],&name,&size,&type); cout << i << ":" << name << endl; } for( int i=0;i<no_windows;i++ ){ xdo_type(p_xdo,windows[i],"Hello World",0); } //xdo_type(p_xdo,CURRENTWINDOW,"Hello World",0); // This does work. return 0; } 

В дополнение к тестированию функциональности xdotool я изучил исходный код xdotool. Интересно, что я нашел, что они используют Xtest для отправки нажатий клавиш в сфокусированное окно ( CURRENTWINDOW ) и XSendEvent X11 для других окон. Я обратился к xdotool, потому что я не мог заставить XSendEvent работать, и Xtest не может отправлять ключи в любые другие windows, кроме сфокусированного windows.

Я не правильно использую xdotool? Не работает xdotool со всеми ОС * nix с X11?

[Я запускаю это на Ubuntu 13.04.]


РЕДАКТИРОВАТЬ

Таким образом, похоже, что это работает, но не для всех окон, которые он находит. Например, он работает для firefox, но не gedit и gnome-terminal, хотя он нашел gedit и gnome-terminal своим pid. Это ведет себя по-другому, если я использовал CURRENTWINDOW .

Так что было бы здорово, если бы кто-нибудь мог объяснить, почему это так. Например, связан ли флаг отправки силы с XEvent?

Непосредственно из руководства xdotool:

ОТПРАВИТЬ ПРИМЕЧАНИЯ

Если вы пытаетесь отправить ключевой ввод в определенное окно, и он, похоже, не работает, вероятно, ваше приложение игнорирует события, которые генерирует xdotool. Это довольно часто.

Отправка нажатий клавиш в определенное окно использует другой API, чем просто ввод в активное окно. Если вы укажете «xdotool type –window 12345 hello», xdotool будет генерировать ключевые события и отправлять их непосредственно в окно 12345. Однако серверы X11 будут устанавливать специальный флаг для всех событий, сгенерированных таким образом (см. XEvent.xany.send_event в X11 руководство). Многие программы соблюдают этот флаг и отклоняют эти события.

Важно отметить, что для событий key и mouse мы используем только XSendEvent, когда нацелено конкретное окно. В противном случае мы используем XTEST.

Некоторые программы могут быть настроены для приема событий, даже если они создаются с помощью xdotool. Обратитесь за помощью к документации вашего приложения.

Специфические примечания к применению (от тестирования автора): * Firefox 3, кажется, игнорирует все входные данные, если у него нет фокуса. * xterm можно настроить во время работы ctrl + leftclick, «Allow SendEvents» * gnome-terminal, по-видимому, принимает сгенерированный ввод по умолчанию.