我试图获取活动窗口的标题。该应用程序是后台任务,因此如果用户打开Eclipse,该函数将返回“Eclipse - blabla”,所以它不会获得我自己窗口的窗口标题。我正在使用PyQt4在Python 2.6中进行开发。在X中获取活动窗口标题
我目前的解决方案,有借,微翘的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;
但由于某些原因窗口总是无。
有人有更好的方式获得当前窗口标题,或如何修改我的方式之一,适用于所有窗口?
编辑:
如果有人想知道,这是我发现,似乎所有窗口的工作方式。
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"
是有目的复制标准输出到root_check如果stdout不为空? – enthdegree 2012-08-10 18:14:00
进一步查看Alex Spurlings的解决方案,他将这一部分拿走了。 – dutt 2012-08-11 21:22:53