Obtenir le titre de la fenêtre active dans X

J’essaie d’obtenir le titre de la fenêtre active. L’application est une tâche en arrière-plan, donc si l’utilisateur a ouvert Eclipse, la fonction renvoie “Eclipse-blabla”, ce qui empêche d’obtenir le titre de la fenêtre de ma propre fenêtre. Je développe ceci dans Python 2.6 en utilisant PyQt4.

Ma solution actuelle, empruntée et légèrement modifiée par rapport à une ancienne réponse de SO, ressemble à ceci:

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].ssortingp(' \n\"') 

Cela fonctionne pour la plupart des fenêtres, mais pas toutes. Par exemple, il ne peut pas trouver mes fenêtres de discussion kopete, ni le nom de l’application que je développe actuellement.

Mon prochain essai ressemble à ceci:

 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; 

Mais pour une raison quelconque, la fenêtre est toujours Aucune.

Quelqu’un a-t-il un meilleur moyen d’obtenir le titre de la fenêtre actuelle ou de modifier l’une de mes méthodes, ce qui fonctionne pour toutes les fenêtres?

Modifier:

Si quelqu’un se demande, c’est ce que je trouve qui semble fonctionner pour toutes les fenêtres.

 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.+)\) = (?P.+)", line) if match != None: type = match.group("type") if type == "STRING" or type == "COMPOUND_TEXT": return match.group("name") return "Active window not found" 

xdotool peut le faire.

xdotool getactivewindow

J’ai modifié légèrement votre solution pour qu’elle fonctionne plus efficacement (elle transmet les parameters à xprop afin que seules les données nécessaires soient renvoyées). En outre, je ne suis pas sûr qu’il soit nécessaire de mettre en mémoire tampon la sortie de xprop, donc je l’ai enlevé. Il convient également de corriger le retour “Fenêtre active non trouvée” si pour une raison quelconque, il ne trouve pas la fenêtre active.

 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.+)$", line) if match != None: return match.group("name") return "Active window not found" 

Vous pouvez obtenir le titre de la fenêtre active avec xdotool :

 $ xdotool getactivewindow getwindowname