В настоящее время я экспериментирую с xdotool для отправки ключей процессу (я понимаю, что он может работать не для всех процессов, для которых не установлен _NET_WM_PID). У меня проблемы с отправкой нажатий клавиш в другие окна из фокуса. Это работает, если вы отправляете нажатия клавиш на CURRENTWINDOW
, Ниже приведен фрагмент кода, который я использовал для проверки функциональности xdotool.
extern "C"{
#include <xdo.h>
}
//extern "C" xdo_window_search
#include <iostream>
#include <string.h>
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
) и X11 XSendEvent
для других окон. Я обратился к xdotool, потому что не мог заставить XSendEvent работать, и Xtest не может отправлять ключи ни в какие другие окна, кроме сфокусированного окна.
Я правильно не использую xdotool? Xdotool не работает со всеми * nix ОС с X11?
[Я запускаю это на Ubuntu 13.04.]РЕДАКТИРОВАТЬ
Таким образом, похоже, что это работает, но не для всех окон, которые он находит. Например, он работает для firefox, но не для gedit и gnome-терминал, хотя он нашел gedit и gnome-терминал по своему pid. Это ведет себя по-другому, если я использовал CURRENTWINDOW
,
Так что было бы здорово, если бы кто-то мог объяснить, почему это так. Мол, это связано с флагом принудительной отправки в XEvent?
Непосредственно из руководства xdotool:
ОТПРАВЛЕННЫЕ ЗАМЕЧАНИЯ
Если вы пытаетесь отправить ключ ввода в определенное окно, и это делает
Похоже, что ваше приложение игнорирует
события, которые генерирует xdotool. Это довольно часто.Отправка нажатий клавиш в определенное окно использует другой API, чем
просто набрав в активном окне. Если вы укажете тип xdotool
—window 12345 hello ‘xdotool сгенерирует ключевые события и отправит их
прямо к окну 12345. Тем не менее, серверы X11 будут устанавливать специальный флаг
на все события, сгенерированные таким образом (см. XEvent.xany.send_event в
Руководство X11). Многие программы отмечают этот флаг и отклоняют эти события.Важно отметить, что для событий клавиш и мыши мы используем только
XSendEvent, когда определенное окно предназначено. В противном случае мы используем XTEST.Некоторые программы могут быть настроены на прием событий, даже если они
генерируется xdotool. Ищите документацию вашего заявления для
Помогите.Конкретные замечания по применению (из авторского тестирования): * Firefox 3
Кажется, игнорирует весь ввод, когда он не имеет фокуса. * xterm может быть
настроен во время работы с Ctrl + левый клик, «Разрешить SendEvents» *
По-видимому, gnome-терминал принимает сгенерированный ввод по умолчанию.
Других решений пока нет …