给定 XX 的进程 ID,我想要一个 _NET_WM_PID = XX 的任何窗口 ID 的列表。如果可能的话,最好是最旧的仍处于事件状态的窗口 id。
我对 linux 很陌生,但我想做的是创建一个脚本,该脚本将采用命令行,并查看是否已经打开了属于使用同一命令行调用的进程的窗口。如果是这样,只需将焦点设置到该窗口,否则执行命令行以启动新进程。我的意图是在我的 ubuntu 桌面上使用它,我将把这个脚本挂接到我的 easystroke 鼠标手势命令中,这样,例如,每次我为 gmail 做手势时,我都不会得到一个全新的 gmail session ,我只是被带到我现有的 gmail chrome 应用程序窗口。也许有一个更简单的方法来解决这一切,但我还没有找到方法。
在帮助下,我弄清楚了如何使用 pgrep 为命令行查找 PID 以及如何使用 wmctrl 将焦点设置到窗口句柄,但我一直坚持从 PID 获取窗口 ID。
最佳答案
xwininfo 和 xprop 允许检索你想要的,但是有点棘手。
xwininfo 允许检索所有已知的窗口,并允许 xprop 向 X 查询您的 _NET_WM_PID 参数的单个窗口 ID。
到目前为止,一个比较老套的方法是:
#!/bin/sh
findpid=$1
known_windows=$(xwininfo -root -children|sed -e 's/^ *//'|grep -E "^0x"|awk '{ print $1 }')
for id in ${known_windows}
do
xp=$(xprop -id $id _NET_WM_PID)
if test $? -eq 0; then
pid=$(xprop -id $id _NET_WM_PID|cut -d'=' -f2|tr -d ' ')
if test "x${pid}" = x${findpid}
then
echo "Windows Id: $id"
fi
fi
done
结果:
mycroft:~ $ ./find_windows.sh 1919
Windows Id: 0x1800748
Windows Id: 0x181b221
Windows Id: 0x1803ad5
Windows Id: 0x181f681
Windows Id: 0x181f658
Windows Id: 0x180006d
Windows Id: 0x1800003
Windows Id: 0x1800001
Windows Id: 0x180001e
如您所见,单个进程可能有一定数量的已知窗口,即使您在屏幕上只看到一个。
也许你应该获取这些工具资源来制作你想要的东西。
https://stackoverflow.com/questions/2250757/