2010-10-21 7 views
14

J'essaie d'obtenir le titre de la fenêtre active. L'application est une tâche d'arrière-plan, donc si l'utilisateur a Eclipse ouverte, la fonction retourne "Eclipse - blabla", donc elle n'obtient pas le titre de la fenêtre de ma propre fenêtre. Je développe ceci dans Python 2.6 using PyQt4.Obtenir le titre de la fenêtre active dans X

Ma solution actuelle, empruntée et légèrement modifiée d'une ancienne réponse ici à 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].strip(' \n\"') 

Il fonctionne pour la plupart des fenêtres, mais pas tous. Par exemple, il ne peut pas trouver mes fenêtres de discussion kopete ou le nom de l'application que je suis en train de développer.

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 fenêtre est toujours Aucun.

Est-ce que quelqu'un a une meilleure façon d'obtenir le titre de fenêtre en cours, ou comment modifier l'un de mes moyens, qui fonctionne pour toutes les fenêtres?

Edit:

En cas de personne se demande c'est la manière que je trouvais cela 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<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" 
+0

est là dans un but de copier stdout à root_check si stdout est non vide? – enthdegree

+1

jetez un coup d'œil à la solution d'Alex Spurlings, il a retiré cette partie. – dutt

Répondre

6

xdotool peut faire cela.

xdotool getactivewindow

+0

J'ai regardé le code source de xdotool et il semble aussi utiliser NET_ACTIVE_WINDOW, ils ont écrit un commentaire "une version légèrement modifiée de xprop". Mais je vais essayer et voir si leur légère modification a fonctionné. – dutt

5

Je modifié votre solution un peu il devrait fonctionner plus efficacement (il passe des paramètres à xprop afin que les données dont il a besoin est retourné). En outre, je ne suis pas sûr qu'il est nécessaire de mettre en tampon la sortie de xprop, alors j'ai enlevé ça. Il devrait également corriger retourner "fenêtre active introuvable" si pour une raison quelconque il ne peut pas trouver 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<name>.+)$", line) 
      if match != None: 
       return match.group("name") 

    return "Active window not found" 
+0

Nice, utilisera cela à la place. Mais je pensais que j'avais déjà correctement retourné "Fenêtre active non trouvée". – dutt

0

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

$ xdotool getactivewindow getwindowname 
Questions connexes