将击键发送到X Window

时间:2013-05-23 13:13:59

标签: c++ ubuntu x11 xdotool

我目前正在尝试使用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不适用于带有X11的所有* nix OS吗?

[我在Ubuntu 13.04上运行它。]


修改

所以,它看起来确实有效,但不适用于它找到的所有窗口。例如,它适用于firefox但不适用于gedit和gnome-terminal,尽管它的pid找到了gedit和gnome-terminal。如果我使用CURRENTWINDOW,它的行为会有所不同。

所以,如果有人可以解释为什么会这样,那就太好了。比如,它是否与XEvent中的force send标志相关?

1 个答案:

答案 0 :(得分:1)

直接来自xdotool手册:

  

SENDEVENT NOTES

     

如果您尝试将键输入发送到特定窗口,则确实如此          似乎没有工作,那么你的应用程序可能会忽略它          xdotool正在生成的事件。这很常见。

     

向特定窗口发送击键使用的API不同          只需键入活动窗口即可。如果指定'xdotool类型          --window 12345你好'xdotool会生成关键事件并发送它们          直接到窗口12345. 但是,X11服务器会设置一个特殊标志          以这种方式生成的所有事件(请参阅中的XEvent.xany.send_event)          X11的手册)。许多程序都会观察此标记并拒绝这些事件。

     

重要的是要注意,对于键和鼠标事件,我们只使用          目标特定窗口时的XSendEvent。否则,我们使用XTEST。

     

某些程序可以配置为接受事件,即使它们是          由xdotool生成。寻找您的申请文件          帮助

     

特定应用笔记(来自作者的测试):* Firefox 3          当它没有焦点时似乎忽略了所有输入。 * xterm可以          使用ctrl + leftclick运行时配置,'允许SendEvents'*          gnome-terminal默认接受生成的输入。