2010-10-21 2 views
14

Sto cercando di ottenere il titolo della finestra attiva. L'applicazione è un'attività in background, quindi se l'utente ha aperto Eclipse la funzione restituisce "Eclipse - blabla", quindi non ottiene il titolo della finestra della mia finestra. Sto sviluppando questo in Python 2.6 usando PyQt4.Ottenere il titolo della finestra attiva in X

mia soluzione attuale, preso in prestito e leggermente modificato da una vecchia risposta qui a SO, si presenta così:

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\"') 

Funziona per la maggior parte delle finestre, ma non tutti. Ad esempio, non riesce a trovare le mie finestre di chat di kopete o il nome dell'applicazione che sto attualmente sviluppando.

mio tentativo successivo è simile al seguente:

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; 

Ma per qualche motivo finestra è sempre Nessuno.

Qualcuno ha un modo migliore di ottenere il titolo attuale finestra, o come modificare uno dei miei modi, che funziona per tutte le finestre?

Edit:

Nel caso in cui qualcuno è chiedendo questo è il modo che ho trovato che sembra funzionare per tutte le finestre.

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

c'è uno scopo per la copia stdout a root_check se stdout è non vuota? – enthdegree

+1

controlla la soluzione di Alex Spurling più in basso, ha preso quella parte. – dutt

risposta

6

xdotool può farlo.

xdotool getactivewindow

+0

Ho guardato attraverso il codice sorgente di xdotool e sembra che utilizzi anche NET_ACTIVE_WINDOW, hanno scritto un commento "una versione leggermente modificata di xprop". Ma farò un tentativo e vedere se la loro leggera modifica ha funzionato. – dutt

5

ho modificato la soluzione leggermente quindi dovrebbe funzionare in modo più efficiente (si passa i parametri per xprop in modo che solo i dati necessari viene restituito). Inoltre, non sono sicuro che sia necessario bufferizzare l'output di xprop, così l'ho eliminato. Dovrebbe anche correggere il ritorno "Finestra attiva non trovata" se per qualche motivo non riesce a trovare la finestra attiva.

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

Bello, lo userà invece. Ma pensavo di aver già correttamente restituito "Finestra attiva non trovata". – dutt

0

È possibile ottenere il titolo della finestra attiva con xdotool:

$ xdotool getactivewindow getwindowname