2013-05-23 4 views
2

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

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's XSendEvent для других окон. Я обратился к xdotool, потому что я не мог заставить XSendEvent работать, и Xtest не может отправлять ключи в любые другие окна, кроме сфокусированного окна.

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

[Я бегу это на Ubuntu 13.04.]


EDIT

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

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

+1

Просто комментарий: Я нашел sikuli быть весьма полезным при попытке отправки произвольных событий мыши и клавиатуры к окнам. Если вы не привязаны к xdotool, вы можете попробовать попробовать сикули. – TeTeT

+0

Благодарим вас за предложение. Я не привязан к xdotool. Я уже реализовал решение через Xlib и Xtest. Я рассмотрю его, если мне нужно отправить произвольные события мыши. Спасибо. – swtdrgn

ответ

0

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

SendEvent ПРИМЕЧАНИЕ

Если вы пытаетесь отправить ввод ключа к определенному окну, и он , кажется, не будет работать, то это, скорее всего, ваше приложение игнорирует события, генерируемые 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, «Разрешить SendEvents» * гном-терминал появится, чтобы принять сгенерированный вход по умолчанию.