用Python获取窗口标题 - 繁琐的方式?

0 投票
2 回答
722 浏览
提问于 2025-04-17 18:18

我想每隔X秒检查一次窗口的标题,用Python来做,这个问题不算太难,我找到了一些工具,比如xprop。
现在问题来了:当我使用xprop -id [id]而不是指针的时候,我只得到2到3行的信息,像这样:

_KDE_NET_WM_USER_CREATION_TIME(CARDINAL) = 24625202
SM_CLIENT_ID(STRING) = "1028c1d320b210000136266856800000015460035"
WM_CLIENT_LEADER(WINDOW): window id # 0x3a00004

这和我在其他地方看到的完全不一样,也不是我需要的内容。那么我该怎么才能获取到窗口标题呢?这是配置出错了,还是我哪里搞错了?

顺便说一下,我用的是Fedora 18。

2 个回答

0

当你使用 xprop -name somewindowname ... 这个命令时,可以获取到所有相关信息。不过,如果你想知道的正是 somewindowname 的话,这种方式可能就不太好用了。

另一种方法是,假设窗口的ID是一个十六进制数字(比如,0x04a27cf6),你可以使用 wmctrl -l 命令,然后用 grep 来查找这个数字。例如,在我的电脑(tini)上,有一个窗口ID是 0x04a27cf6,标题是 "xprop man page",

wmctrl  -l | grep 0x04a27cf6

会得到这样的结果

0x04a27cf6  4 tini xprop man page

需要注意的是,"wmctrl 是一个用于与 EWMH/NetWM 兼容的 X 窗口管理器交互的 UNIX/Linux 命令行工具",具体可以参考 tomas.styblo.name维基百科。很多 Linux 发行版的包管理器都可以安装它。

补充:在阅读了 n.m. 的回答后,我又用 xprop 进行了更多测试。昨天的测试中,xprop -id 0x4a27cf7 只输出了一行,内容是 _NET_WM_USER_TIME(CARDINAL) = 440569797。这并不是因为“把你的终端往上滚动很久”。不幸的是,我现在没有窗口 0x4a27cf7 了,而现在所有类似的测试似乎都正常工作,正如 n.m. 的回答所示。例如,在执行完这个命令后

for i in $(wmctrl -l |tee w-wmctrl | cut -c-10); do xprop -id $i | grep ^WM_NAME; done > w-xprop

文件 w-wmctrlw-xprop 各自都有 39 行内容,通过 diff -y w-*|less 进行并排比较,结果显示两个文件中的名称完全一致。

0

你可以通过 -id 和鼠标点击来获取相同的一组属性,前提是你在两种情况下都选择了同一个窗口。要获取窗口的ID,可以使用 xwininfo 命令,然后点击那个窗口。

你看到的那一小部分属性可能是因为列表很长,还包含很多空行。试着把你的终端向上滚动一下。

撰写回答