一尘不染

是否有Linux命令来确定与给定进程ID相关联的窗口ID?

linux

给定XX的进程iD,我想有一个任何窗口ID的列表,其中_NET_WM_PID = XX。如果可能的话,最好的办法是最旧的仍处于活动状态的窗口ID。

我对linux还是很陌生,但是我想做的是创建一个使用命令行的脚本,并查看是否有一个窗口已经打开,该窗口属于使用同一命令行调用的进程。如果是这样,只需将焦点设置在该窗口上,否则执行命令行以进行新的处理。我的意图是在我的ubuntu桌面上使用此脚本,在这里我会将这个脚本挂接到我的笔触鼠标手势命令中,这样,例如,每次我为gmail手势时,我都不会获得全新的gmail会话,转到我现有的gmail
chrome应用程序窗口。也许有一个更简单的方法可以解决所有这些问题,但是我还没有找到解决方法。

在帮助下,我已经弄清楚了如何使用pgrep为命令行找到PID,以及如何使用wmctrl将焦点设置到窗口句柄,但是我一直坚持从PID到窗口ID。


阅读 464

收藏
2020-06-07

共1个答案

一尘不染

xwininfo和xprop允许检索您想要的内容,但这有点棘手。

xwininfo允许检索所有已知的窗口,并且xprop可以查询_NET_WM_PID参数的有关单个窗口ID的X。

到目前为止,一种骇人听闻的方法是:

#!/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

如您将看到的,即使您仅在屏幕上看到一个窗口,单个进程也可能具有一定数量的已知窗口。

也许您应该获得这些工具资源,以便做出自己想要的东西。

2020-06-07