【发布时间】:2010-10-21 02:52:32
【问题描述】:
我正在尝试获取活动窗口的标题。该应用程序是一项后台任务,因此如果用户打开 Eclipse,该函数将返回“Eclipse - blabla”,因此它不会获得我自己窗口的窗口标题。我正在使用 PyQt4 在 Python 2.6 中开发它。
我目前的解决方案是从 SO 的旧答案借用并稍作修改的,如下所示:
def get_active_window_title():
title = ''
root_check = ''
root = Popen(['xprop', '-root'], stdout=PIPE)
if root.stdout != root_check:
root_check = root.stdout
for i in root.stdout:
if '_NET_ACTIVE_WINDOW(WINDOW):' in i:
id_ = i.split()[4]
id_w = Popen(['xprop', '-id', id_], stdout=PIPE)
for j in id_w.stdout:
if 'WM_ICON_NAME(STRING)' in j:
if title != j.split()[2]:
return j.split("= ")[1].strip(' \n\"')
它适用于大多数窗口,但不是全部。例如,它找不到我的 kopete 聊天窗口,或我当前正在开发的应用程序的名称。
我的下一次尝试是这样的:
def get_active_window_title(self):
screen = wnck.screen_get_default()
if screen == None:
return "Could not get screen"
window = screen.get_active_window()
if window == None:
return "Could not get window"
title = window.get_name()
return title;
但出于某种原因,window 始终为 None。
是否有人有更好的方法来获取当前窗口标题,或者如何修改我的一种方法,适用于所有窗口?
编辑:
如果有人想知道这是我发现似乎适用于所有窗口的方式。
def get_active_window_title(self):
root_check = ''
root = Popen(['xprop', '-root'], stdout=PIPE)
if root.stdout != root_check:
root_check = root.stdout
for i in root.stdout:
if '_NET_ACTIVE_WINDOW(WINDOW):' in i:
id_ = i.split()[4]
id_w = Popen(['xprop', '-id', id_], stdout=PIPE)
id_w.wait()
buff = []
for j in id_w.stdout:
buff.append(j)
for line in buff:
match = re.match("WM_NAME\((?P<type>.+)\) = (?P<name>.+)", line)
if match != None:
type = match.group("type")
if type == "STRING" or type == "COMPOUND_TEXT":
return match.group("name")
return "Active window not found"
【问题讨论】:
-
如果stdout非空,是否有目的将stdout复制到root_check?
-
进一步查看 Alex Spurlings 解决方案,他已将那部分排除在外。