`xdotool` 不发送密钥

`xdotool` 不发送密钥

我正在尝试通过 发送击键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即 no )。顺便说一句,在脚本中,键被", 像包围"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

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

从理论上讲,这是有一个安全原因的——您可能会在 X 显示器上运行应用程序,但在不同的帐户或不同的机器上——但是 X 在隔离应用程序方面非常糟糕(它从来不是为此设计的),因此您不应该这样做根本不允许不受信任的应用程序访问您的显示器。如果您不这样做,那么就没有理由拒绝合成事件。

据我所知,Gtk 没有提供通用的方法来决定是否允许合成事件。这取决于个人应用程序,如果程序员不关心,我不知道默认值是什么。

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

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

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

答案2

这听起来很愚蠢,但请确认您使用的是 X11 而不是 Wayland:

echo $XDG_SESSION_TYPE

如果输出wayland它就不起作用(X工具)

相关内容