在X中获得活动的窗口标题

我试图获得活动窗口的标题。 该应用程序是一个后台任务,所以如果用户打开了Eclipse,该函数返回“Eclipse – Blabla”,所以它没有得到我自己的窗口的窗口标题。 我正在使用PyQt4在Python 2.6中进行开发。

我现在的解决scheme是从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" 

Solutions Collecting From Web of "在X中获得活动的窗口标题"

xdotool可以做到这一点。

xdotool getactivewindow

我稍微修改了你的解决方案,所以它应该更有效地运行(它将参数传递给xprop,所以只返回它所需要的数据)。 另外,我不确定有必要缓冲xprop的输出,所以我把它拿出来了。 它也应该正确返回“活动窗口未找到”,如果由于某种原因,它不能找到活动窗口。

 def get_active_window_title(self): root = Popen(['xprop', '-root', '_NET_ACTIVE_WINDOW'], stdout=PIPE) for line in root.stdout: m = re.search('^_NET_ACTIVE_WINDOW.* ([\w]+)$', line) if m != None: id_ = m.group(1) id_w = Popen(['xprop', '-id', id_, 'WM_NAME'], stdout=PIPE) break if id_w != None: for line in id_w.stdout: match = re.match("WM_NAME\(\w+\) = (?P<name>.+)$", line) if match != None: return match.group("name") return "Active window not found" 

你可以用xdotool获得活动的窗口标题:

 $ xdotool getactivewindow getwindowname