Ich versuche, den Titel des aktiven Fensters zu bekommen. Die Anwendung ist eine Hintergrundaufgabe. Wenn der Benutzer Eclipse geöffnet hat, gibt die Funktion "Eclipse - blabla" zurück, so dass der Fenstertitel meines eigenen Fensters nicht angezeigt wird. Ich entwickle das in Python 2.6 mit PyQt4.Aktiviere Fenstertitel in X
Meine aktuelle Lösung, entlehnt und leicht von einer alten Antwort hier so modifiziert, sieht wie folgt aus:
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\"')
Es funktioniert für die meisten Fenster, aber nicht alle. Zum Beispiel kann es mein Kopete-Chat-Fenster oder den Namen der Anwendung, die ich gerade entwickle, nicht finden.
Mein nächster Versuch sieht wie folgt aus:
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;
Aber aus irgendeinem Grund Fenster ist immer Keine.
Hat jemand eine bessere Möglichkeit, den aktuellen Fenstertitel zu erhalten oder eine meiner Möglichkeiten zu ändern, die für alle Fenster funktioniert?
Edit:
Falls jemand fragt, dies ist die Art, wie ich festgestellt, dass für alle Fenster zu funktionieren scheint.
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"
gibt es einen Zweck stdout zu kopieren root_check wenn stdout nicht leer ist? – enthdegree
check out Alex Spurling Lösung weiter unten, er hat diesen Teil herausgenommen. – dutt