在 bash 命令行中,是否有办法将焦点放在正在运行的进程的特定窗口上。假设我知道进程的名称、编号以及我需要的任何其他信息。
例如,如果我正在运行一个 Firefox 实例,但它被最小化了(或者它上面有其他窗口)。我需要一个 bash 命令来调出 Firefox 窗口并将其作为活动窗口,从而将焦点放在该窗口上。
答案1
wmctrl 命令似乎可以完成这项工作。它已经为我安装了,但它在存储库中可用,以备有人需要它。
wmctrl -l
列出当前打开的窗口(包括 gnome 面板)。
wmctrl -a STRING
将焦点放在标题中包含 STRING 的窗口上。我不确定如果多个窗口满足该条件会发生什么。
在我的例子中,命令是:
wmctrl -a Firefox
答案2
wmctrl
结合使用,xdotool
您可以将焦点切换到 Firefox,然后执行键盘或鼠标操作。
在此示例中:
wmctrl -R firefox && \
xdotool key --clearmodifiers ctrl+t ctrl+l && \
xdotool type --delay=250 google && \
xdotool key --clearmodifiers Tab Return
执行以下步骤:
- 将焦点放在第一个匹配的 Firefox 窗口上
- 打开新的浏览器标签页
- 将焦点放在地址栏上
- 输入“google”
- 按 Tab 键跳至第一个浏览器自动完成结果
- 按 Return(或 Enter)键
答案3
我在 Ubuntu PC 上使用的以下脚本怎么样?用例是这样的。
$ ./focus_win.sh 1 # focus on a application window that executed at first
$ ./focus_win.sh 2 # second executed application window
我在键盘自定义快捷键中分配它后使用它。ctrl+1,ctrl+2,...
猫焦点_win
#! /bin/sh
if [ "" = "$1" ] ; then
echo "usage $0 <win index>"
exit 1;
fi
WIN_ID=`wmctrl -l | cut -d ' ' -f1 | head -n $1 | tail -n 1`
if [ "" = "$WIN_ID" ] ; then
echo "fail to get win id of index $1"
exit 1;
fi
wmctrl -i -a $WIN_ID
答案4
正如另一个答案已经提到的,wmctrl
对于这项任务来说是一个不错的选择,并且wmctrl -a WINDOWTITLE
允许人们激活标题包含的窗口WINDOWTITLE
。
然而,在许多情况下,窗口标题不包含所用程序的名称。为此, wmctrl
还可以-x
使用按类名聚焦窗口的选项。
您可以键入wmctrl -lx
来打印所有当前打开的窗口及其类名。您可以使用 来wmctrl -xa NAME
激活类名包含 的窗口NAME
。
例如,我遇到一个问题,如果 Evince PDF 查看器窗口已打开,我想激活它,但我无法仅通过窗口名称来做到这一点,因为它始终只包含所查看的 PDF 的名称。所以我使用wmctrl -lx
并找到了以下行
0x06000007 0 evince.Evince sejmou-desktop 2. User-User Collaborative Filtering
evince.Evince
上面提到的窗口类名在哪里呢?
然后,我能够以编程方式激活 Evince 窗口wmctrl -xa Evince
。当然,只有当Evince
是当前打开的窗口中唯一的类名时,这才能可靠地工作。