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

bur*_*rsk 49 process input x11

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

# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 64

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)
Run Code Online (Sandbox Code Playgroud)

或者使用旧版本的 xdotool:

xdotool windowactivate $(xdotool search --class Chrome) &&
xdotool key F5 &&
xdotool windowactivate $(xdotool getactivewindow)
Run Code Online (Sandbox Code Playgroud)

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

  • `--windowid` 标志现在是 `--window`(该命令同样警告你) (4认同)
  • 嵌套完全没有必要,应该是`xdotool search --class Chrome key F5` (3认同)
  • `--title` 选项现在是 `--name`(该命令忠实地警告) (2认同)

小智 17

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

 xdotool key --windowid <window> <keystroke>
Run Code Online (Sandbox Code Playgroud)

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

 xdotool windowactivate --sync <window> key <keystroke>
Run Code Online (Sandbox Code Playgroud)

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

http://pcfellow.com/ClementineRemote.html

  • @Geremia,由于 xdotool 文档中的 [SENDEVENT NOTES](https://github.com/jordansissel/xdotool/blob/master/xdotool.pod#sendevent-notes) 中提供的原因,它可能不起作用。 (2认同)

小智 6

我在运行 Raspbian Wheezy 的 Raspberry Pi 上有一个类似的用例。我需要使用 kiosk 模式在 Chrome 上旋转标签(遗憾的是,在旧 Chrome 上安装扩展程序不再合理)。接受的答案的示例有一些拼写错误或根本不适用于我的软件版本,以下是对我有用的方法:

xdotool key --window "$(xdotool search --class Chromium | head -1)" Ctrl+Tab
Run Code Online (Sandbox Code Playgroud)


And*_*rie 5

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

<meta http-equiv="refresh" content="5">
Run Code Online (Sandbox Code Playgroud)

每 5 秒自动刷新一次(如果需要,您可以将其设置得更短或更长)。

  • 您可以使用用户脚本将该标签插入到页面中。与向窗口发送按键相比,这可能是一个不那么脆弱的解决方案。 (7认同)
  • 不错的尝试,但我没有 Twitter,我的 ISP 的监控软件和我必须监控的其他站点;) 我之前可能应该提到这一点 (3认同)