4

現在、プロセスにキーを送信するために 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。XSendEvent を動作させることができず、Xtest がフォーカスされたウィンドウ以外のウィンドウにキーを送信できないため、xdotool を使用しました。

xdotool を正しく使用していませんか? xdotool は、X11 を使用するすべての *nix OS で動作しませんか?

[これを Ubuntu 13.04 で実行しています。]


編集

したがって、それは機能するように見えますが、見つかったすべてのウィンドウでは機能しません。たとえば、pid で gedit と gnome-terminal を見つけたにもかかわらず、firefox では機能しますが、gedit と gnome-terminal では機能しません。を使用した場合、動作が異なりCURRENTWINDOWます。

ですから、誰かがなぜそうなのかを説明できれば素晴らしいでしょう。同様に、XEvent の強制送信フラグに関連していますか?

4

1 に答える 1