首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有linux命令可以确定与给定进程ID关联的窗口ID?

是否有linux命令可以确定与给定进程ID关联的窗口ID?
EN

Stack Overflow用户
提问于 2010-02-12 17:28:10
回答 6查看 59.2K关注 0票数 45

给定进程iD为XX,我希望有一个_NET_WM_PID = XX的所有窗口id的列表。如果可能的话,更好的方法是最老的仍然活动的窗口id。

我对linux是个新手,但我要做的是创建一个脚本,这个脚本需要一个命令行,看看是否有一个已经打开的属于同一个命令行调用的进程的windows。如果是,只需将焦点设置到该窗口,否则执行命令行以使新进程继续运行。我的目的是在我的ubuntu桌面上使用它,在那里我会将这个脚本挂到我的鼠标手势命令中,这样,例如,每次我对gmail做手势时,我不会得到一个全新的gmail会话,我只是被带到我现有的gmail chrome应用程序窗口。也许有一种更简单的方法来做这一切,但我还没有找到我的方法。

在帮助下,我已经了解了如何使用pgrep查找命令行的PID,以及如何使用wmctrl将焦点设置到窗口句柄,但我仍然坚持从PID到窗口ID。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-12 17:50:36

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

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

到目前为止,一种简单的方法是:

代码语言:javascript
复制
#!/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

结果:

代码语言:javascript
复制
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

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

也许你应该获得这些工具的源代码,以便做出你想要的东西。

票数 41
EN

Stack Overflow用户

发布于 2012-09-18 09:12:47

事实上,您也可以使用wmctrl来查找PID,我认为这是一个更好的方法。xwininfo将返回各种看似windows的实体,但你不会真的在桌面上找到它们。

如果您使用man wmctrl,您会发现wmctrl -l列出了在您桌面上实际可见的所有窗口,以及(最重要的)窗口If和标题。-p添加PID,-x将添加窗口类。

正如手册所说( RTFM,对吧?:D),wmctrl还可以搜索其中的一些内容,并激活与搜索匹配的窗口。然而,我不知道是什么决定了所有可能的匹配项中的哪一个将被返回。另一方面,您可以使用提供的列表函数来编写一个包装器,该包装器可以更好地执行搜索,并且可能基于一些其他属性(例如,最后一次访问窗口的时间戳),例如,您可以通过向xprop查询所提供的win来获得这些属性。

下面这几行代码返回最新的一个mate-terminal类窗口:

代码语言:javascript
复制
XTIME="_NET_WM_USER_TIME" #a shorter name for xprop query that shoul return timestamps
export TMPDIR=/dev/shm    #save tmp files to memory to make it faster
LST=`mktemp`              #tmp file to store our listing 
wmctrl -lx |  awk -F' ' '{printf("%s\t%s    \t",$1,$3); for(i=5;i<=NF;i++) printf("%s",$i); printf("\n")  }'  > $LST #pretty-print our listing of windows into the tmp file
 #To each line of listing, prepend a timestamp acquired via an xprop call
 #Use awk to find a line whose 3rd column (winclass) matches the window class "mate-terminal.Mate-terminal" and among those that do, find the one whose timestamp is the largest
while read LINE; do ID=`echo "$LINE"|cut -f 1`; TIME=`xprop -id $ID $XTIME`;  TIME="${TIME/* = /}"; echo -e "$TIME\t$LINE" ; done <$LST ) | awk -v s="mate-terminal.Mate-terminal" '$3 == s {if($1>max){max=$1;line=$0};};END{print line}'
rm $LST  #delete tmp file

无论如何,对于你描述的你正在构建的东西-如果我是你,我会找出你想要的命令生成的窗口类,然后基于它而不是PID进行搜索。或者,您可以假定命令CMD可能会生成具有包含CMD的类名的窗口。

找到行之后,您应该使用窗口id

通过wmctrl激活窗口。

希望这能有所帮助。

附注:我发现xdotool也可以基于类名和窗口标题进行搜索,但速度非常慢。在我的计算机上,这个bash脚本(它调用了相当多的外部实用程序)的速度是编译后的替代脚本xdotool :P的10倍。

票数 35
EN

Stack Overflow用户

发布于 2017-04-11 13:32:09

您可以使用:

代码语言:javascript
复制
xdotool getwindowfocus getwindowname

(原样:您不需要用任何东西替换这些听起来很好听的名称。)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2250757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档