`xdotool`不发送密钥


8

我正在尝试通过发送按键xdotool。但是,发送无法正常工作。

以下是脚本的日志,该脚本应选择Gedit中的所有文本并进行复制(但不执行任何操作)及其输出(通过重定向stdout和stderr捕获):

+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1

我已经尝试过Thunderbird,并且脚本确实发送了密钥,但是没有修饰符(即没有Control)。顺便说一句,在脚本中,键由包围",例如"ctrl+a"

Gedit和Thunderbird之间的区别可能是Gedit是GTK3应用程序,而Thunderbird似乎是GTK2应用程序(但是Firefox,它似乎是GTK3应用程序,其行为类似于Thunderbird)。

xdotool版本3.20141006.1
操作系统:Debian GNU / Linux 8.1(Linux内核3.16.0-4-amd64)
桌面管理器:GNOME Shell 3.14.4


1
如果您使用它,xbindkeys则必须释放触发脚本的键才能xdotool keyup ...进行可靠的操作
catchantot

Answers:


7

当应用程序而不是输入外围设备生成键盘或鼠标事件时,该事件将被标记为“合成”事件。许多应用程序拒绝合成事件。

从理论上讲,出于安全原因-您可以在X显示器上运行应用程序,但是使用不同的帐户或在另一台计算机上运行-但是X很难隔离应用程序(从来没有为此目的而设计),因此您不应该完全不允许不受信任的应用程序访问您的显示。如果您不这样做,那么就没有理由拒绝合成事件。

据我所知,Gtk没有提供一种通用的方式来决定是否允许合成事件。这取决于各个应用程序,而且我不知道如果程序员不在乎默认值是什么。

XTEST扩展是注入输入事件的另一种方法。以这种方式注入的事件看起来与来自输入外围设备的事件完全一样:实际上,它们来自“测试”输入外围设备。这种方法的缺点是,它们以与其他任何事件相同的方式被路由到窗口,因此它们被发送到具有焦点的窗口(除非被窗口管理器拦截)。您可以使用xdotool(可能是最新版本)发送XTEST事件,如果不传递窗口ID,它就是这样做的。

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

是的,这很烦人。您可以在Selenium Wiki上找到有关此问题的讨论。似乎有一种方法可以通过GTK信号或GDK事件将虚假事件发送到GTK +应用程序,但我不知道这是如何工作的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.