在不占用键盘的情况下将击键发送到非活动的GUI应用程序

时间:2019-05-08 13:14:00

标签: python linux shell user-interface automation

正如标题所述,我正在尝试使用终端将命令作为击键发送到最小化的GUI应用程序。

在Stack上有很多类似的问题,都给出了很好的答案,但是我主要看到的解决方案存在三个问题:大多数解决方案都需要自动化的应用程序才能成为活跃的解决方案。或者,在脚本/进程运行时,我通常无法使用键盘。或更糟糕的是,该解决方案仅适用于Windows操作系统。

我需要这个人在2个月前问的问题:Send keystrokes to a specific window (in background), but do something else in the meantime 但是我想要在Linux上。 如果有帮助,我正在使用Kubuntu 18.10。

xdotool已关闭,但我无法完全将命令发送到特定窗口或PID。它还使用“我的键盘”,因此,例如,当xdotool运行时,我无法在线编写论文/代码/浏览。 Pexpect也有最后一个问题。

AutoHotKey看起来可以工作,但是它仅适用于Windows,并且我试图不使用Wine。与pywin32相同。

键盘(https://github.com/boppreh/keyboard)看起来不错,但是它无法将命令发送到特定的应用程序。与PyAutoGUI相同。

我选择Python标记是因为我看到的大多数解决方案都使用Python,但是我可以使用任何语言。

1 个答案:

答案 0 :(得分:3)

使用嵌套的X服务器输入击键,而无需更改焦点或键盘键。 概念证明:

Xephyr -resizeable :13
export DISPLAY=:13
xterm
xdotool type rhabarber

Xephyr嵌套的X服务器已启动,并将在本地X套接字13上侦听(而:0通常标识当前正在运行的X服务器,但是当同时运行多个会话时,它可能更高)。 然后,我们将DISPLAY环境变量设置为:13,这样,我们启动的任何X应用程序都将连接到Xephyr。 xterm是我们此处的目标应用程序。使用xdotool或任何其他工具,我们可以发送击键。

由于通过$DISPLAY标识了目标X服务器,因此可以启动应用程序或输入其他地方触发的事件。如果需要,您还可以在Xephyr中运行轻量级的窗口管理器,例如来“最大化”应用程序,以使其充满整个Xephyr窗口。