我将 Raspberry Pi 与 Chromium(信息亭模式)结合使用来显示一些统计数据。 Pi 没有连接键盘,所以我搜索了一个将击键从终端发送到 Chromium(选项卡)进程的解决方案。正常输入确实有效,但如何F5
通过此解决方案发送类似(特殊键:浏览器刷新)之类的内容?
# pidof chromium
20809 20790 20788 20786 20783
# echo 'some text' > /proc/20809/fd/0
答案1
GUI 程序不从标准输入中读取数据,而是从X服务器。有一些工具可以将击键注入窗口。xdo工具是相当普遍和方便的。
您需要找到要将击键发送到的窗口 ID。您可以使用 xdotool 来做到这一点。xdotool search --class Chrome
返回所有 Chrome 窗口的窗口 ID 列表。如果返回多个,您需要选择您想要的。您可以使用xdotool search --name
来匹配标题而不是类别。您还可以解析以下输出控制面板并提取所需的窗口 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 中,这会重新加载当前选项卡。
答案2
上面建议的解决方案使用 xdotool 像这样
xdotool key --windowid <window> <keystroke>
这对我不起作用。经过一些实验,我到达了
xdotool windowactivate --sync <window> key <keystroke>
有一次,这似乎有效,我定义了一些脚本并更新了我的 .lircrc 文件,如下所示:
答案3
我在运行 Raspbian Wheezy 的 Raspberry Pi 上有一个类似的用例。我需要使用 kiosk 模式在 Chrome 上旋转选项卡(遗憾的是,在旧版 Chrome 上安装扩展程序来执行此操作不再合理)。接受的答案的示例有一些拼写错误或者根本不适用于我的软件版本,以下是对我有用的内容:
xdotool key --window "$(xdotool search --class Chromium | head -1)" Ctrl+Tab
答案4
我过去曾使用自动热键来执行诸如发送按键之类的操作,但这在 Linux 上不可用,但快速 Google 搜索显示有 IronAHK (http://www.ironahk.net/)目前还没有太多可用的文档,但它可能可以解决问题。