检测当前活动的窗口


52

linux命令行工具wmctrl使您可以列出所有窗口或所有桌面。在桌面列表模式下,当前桌面标有星号。

我需要一个可以确定当前活动窗口标题的工具。不幸的是,wmctrl尽管知道当前哪个窗口处于活动状态,但没有帮助程序可以执行此操作(请参见:ACTIVE:标记)。

是否有另一个命令行工具可以为我提供当前窗口的窗口ID和/或窗口标题?

Answers:


56

安装xdotool,然后运行

xdotool getwindowfocus getwindowname

例如,它将给出在Firefox中打开的当前网页:

linux - Detecting currently active window - Super User - Mozilla Firefox

功能强大的工具!除了获得当前的活动窗口外,它还具有许多其他有用的功能。
Searene 2014年

与Jim Paris的答案相比,这具有安装依赖项的缺点,但是它运行得更快,特别是如果xdotool已经在磁盘缓存中。
mc0e 2015年

1
如果要使用来操作当前窗口wmctrl,则可以执行以下操作:wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1,其中-i告诉wmctrl期望窗口ID而不是窗口标题。
fiedl 2015年

34

这是更直接的方法,仅使用xpropcut

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

这些命令只是从根窗口和应用程序窗口中提取的属性,但应Lorenzo von Matterhorn的要求:

  • 第一,

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    _NET_ACTIVE_WINDOW从根提取属性,从而为您提供活动窗口的XID。该32x '\t$0'告诉xprop格式化输出的方式,cut可以很容易地分析之后。

  • 然后,使用以下命令从输出中仅提取XID cut -f 2

  • 然后,将XID作为参数传递给

    xprop -id XID _NET_WM_NAME
    

它将打印该窗口的名称。


1
嗨,你能解释一下参数和一些语法吗?对于质量检查人员和以后的读者可能会有帮助。
洛伦佐·冯·马特洪峰

9

有,但没有简短的答案或解决方案。

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

结果:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

正在使用:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)

1
这看起来是个不错的解决方案,对xprop实用程序一无所知。同时,我修补了wmctrl以提供这样的选项并将其发送给作者。不幸的是,我还没有得到答复。
戴夫·沃格特

1
+1表示代码的有效性和“简单性”
Lorenzo Von Matterhorn

5

这对我有用:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME

给出:

WM_NAME(STRING) = "~"

因此,也许您会做些麻烦来获得名称本身:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

给出:

~

这是我当前关注的窗口名称,全部都是它自己。

或者,避免使用稍微不那么丑陋的sed:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'


1
或者,因为已经引入了cut,所以您可以再次使用它:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e 2015年

3

相对较短,并正确处理包含引号的窗口名称:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.