如何从终端向GUI程序发送击键(F5)?


40

我将Raspberry Pi与Chromium(kiosk模式)结合使用以显示一些统计信息。Pi没有连接的键盘,因此我搜索了一种解决方案,以将键盘击键从终端发送到Chromium(tab)进程。普通输入确实有效,但是如何F5通过此解决方案发送类似信息(特殊键:浏览器刷新)?

# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0

Answers:


51

GUI程序不从其标准输入中读取,而是从X服务器获取其输入。有一些工具可以将击键插入窗口。xdotool非常普遍且方便。

您需要找到要将按键发送到的窗口ID。您可以使用xdotool做到这一点。xdotool search --class Chrome返回所有Chrome窗口的窗口ID列表。如果返回的结果不止一个,则需要选择所需的一个。您可以使用xdotool search --name标题上的匹配来代替类。您还可以解析wmctrl的输出并提取所需的窗口ID。

找到正确的窗口ID后,您可以调用xdotool来击键。不幸的是,许多应用程序拒绝合成事件,即另一个应用程序发送的击键和鼠标事件。当前版本的Chrome就是这种情况。可以通过不同的机制从另一个应用程序中注入击键,但这需要使窗口聚焦。您可以使用xdotool进行所有操作,但这会导致焦点快速闪烁到Chrome窗口并返回。以下代码段F5(按任意顺序)发送到第一个Chrome窗口。

xdotool search --class Chrome windowactivate --sync %1 key F5 windowactivate $(xdotool getactivewindow)

或使用旧版本的xdotool:

xdotool windowactivate $(xdotool search --class Chrome) &&
xdotool key F5 &&
xdotool windowactivate $(xdotool getactivewindow)

请记住,这将发送F5到该窗口,并由程序决定如何处理它。在Chrome中,这会重新加载当前标签页。


4
--windowid标志是现在--window(命令警告你尽可能多)
路易·马多克斯

2
--title现在的选项是--name(命令会忠实地发出警告)
jpaugh

2
嵌套是完全不必要的,它应该是 xdotool search --class Chrome key F5
phil294'3

1
@Blauhirn在旧版本的xdotool中,嵌套是必需的。但是,谢谢,我已经更新了答案,还显示了更新的语法。
吉尔斯(Gillles)“所以-别再作恶了”

哦,由于我正在对此进行更新,因此Chrome现在拒绝了合成事件。叹息
吉尔斯(Gilles)'

15

上面建议的解决方案像这样使用xdotool

 xdotool key --windowid <window> <keystroke>

这对我不起作用。经过一些试验,我到达了

 xdotool windowactivate --sync <window> key <keystroke>

一次,这似乎可行,我定义了一些脚本并更新了.lircrc文件,如下所示:

http://pcfellow.com/ClementineRemote.html


我不知道为什么您的第一个例子不起作用?将击键发送到非焦点窗口会很好。
Geremia

1
@Geremia,由于xdotool文档中SENDEVENT NOTES中提供的原因,它可能无法正常工作。
Janthelme '18

4

我在运行Raspbian Wheezy的Raspberry Pi上有一个类似的用例。我需要使用信息亭模式在Chrome上旋转标签页(不幸的是,安装扩展程序以在旧版Chrome上执行此操作不再合理)。接受的答案的示例有些错别字或根本不适用于我的软件版本,以下是对我有用的:

xdotool key --window "$(xdotool search --class Chromium | head -1)" Ctrl+Tab

4

如果您使用Chromium显示自定义网页,并希望它定期刷新,则可以在其中添加以下标签:

<meta http-equiv="refresh" content="5">

以每5秒自动刷新一次(您可以根据需要将其设置为更短或更长)。


2
不错的尝试,但我不拥有Twitter,ISP的监视软件以及我必须监视的其他站点;)我可能之前应该提到过
Burnersk

4
您可以使用用户脚本将该标签插入页面。与向窗口发送按键相比,此解决方案可能不那么脆弱。
sherbang

2

我曾经使用过自动热键来执行发送按键之类的操作,但是在Linux上不可用,但是通过Google的快速搜索发现IronAHK(http://www.ironahk.net/)并不多文档可用,但可以解决问题。


链接不再有效。
AntonínProcházka
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.