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

В настоящее время я экспериментирую с 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?

3

Решение

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

ОТПРАВЛЕННЫЕ ЗАМЕЧАНИЯ

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

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

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

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

Конкретные замечания по применению (из авторского тестирования): * Firefox 3
Кажется, игнорирует весь ввод, когда он не имеет фокуса. * xterm может быть
настроен во время работы с Ctrl + левый клик, «Разрешить SendEvents» *
По-видимому, gnome-терминал принимает сгенерированный ввод по умолчанию.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]