swt*_*rgn 5 c++ x11 ubuntu 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;
}
Run Code Online (Sandbox Code Playgroud)
除了测试 xdotool 的功能之外,我还研究了 xdotool 的源代码。有趣的是,我发现他们使用 Xtest 将击键发送到聚焦窗口 ( CURRENTWINDOW
),并使用 X11 将击键发送XSendEvent
到其他窗口。我转向 xdotool,因为我无法让 XSendEvent 工作,并且 Xtest 无法将密钥发送到聚焦窗口之外的任何其他窗口。
我是否没有正确使用xdotool?xdotool 是否不适用于所有带有 X11 的 *nix 操作系统?
[我在 Ubuntu 13.04 上运行这个。]
编辑
所以,看起来这确实有效,但不适用于它找到的所有窗口。例如,它适用于 firefox,但不适用于 gedit 和 gnome-terminal,尽管它通过其 pid 找到了 gedit 和 gnome-terminal。如果我使用它,它的行为会有所不同CURRENTWINDOW
。
因此,如果有人能解释为什么会这样,那就太好了。比如,它与 XEvent 中的强制发送标志相关吗?
直接来自 xdotool 手册:
发送事件注释
如果您尝试将按键输入发送到特定窗口,但它似乎不起作用,那么您的应用程序可能会忽略 xdotool 正在生成的事件。这是相当常见的。
将击键发送到特定窗口使用的 API 与简单地在活动窗口中键入不同。如果指定“xdotool type --window 12345 hello”,xdotool 将生成按键事件并将它们直接发送到窗口 12345。 但是,X11 服务器将为以这种方式生成的所有事件设置一个特殊标志(请参阅 X11 中的 XEvent.xany.send_event手动的)。许多程序都会观察此标志并拒绝这些事件。
需要注意的是,对于按键和鼠标事件,我们仅在针对特定窗口时使用 XSendEvent。否则,我们使用 XTEST。
有些程序可以配置为接受事件,即使这些事件是由 xdotool 生成的。寻求您的应用程序文档以寻求帮助。
具体应用笔记(来自作者的测试): * Firefox 3在没有焦点时似乎会忽略所有输入。* xterm 可以在使用 ctrl+leftclick 运行时进行配置,“允许发送事件” * gnome-terminal 默认情况下似乎接受生成的输入。
归档时间: |
|
查看次数: |
5905 次 |
最近记录: |