2010-10-21 26 views
14

我試圖獲取活動窗口的標題。該應用程序是後臺任務,因此如果用戶打開Eclipse,該函數將返回「Eclipse - blabla」,所以它不會獲得我自己窗口的窗口標題。我正在使用PyQt4在Python 2.6中進行開發。在X中獲取活動窗口標題

我目前的解決方案,有借,微翹的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" 
+0

是有目的複製標準輸出到root_check如果stdout不爲空? – enthdegree 2012-08-10 18:14:00

+1

進一步查看Alex Spurlings的解決方案,他將這一部分拿走了。 – dutt 2012-08-11 21:22:53

回答

6

xdotool可以做到這一點。

xdotool getactivewindow

+0

我瀏覽了xdotool的源代碼,它似乎也使用了NET_ACTIVE_WINDOW,他們寫了一個評論「xprop的一個稍微修改過的版本」。但我會試一試,看看他們的細微修改是否有效。 – dutt 2010-10-21 04:13:33

5

我修改您的解決方案略有所以它應該更有效地運行(它傳遞的參數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" 
+0

不錯,會用這個代替。但我認爲我已經正確地返回「未找到活動窗口」。 – dutt 2011-03-14 07:22:23

0

你可以得到xdotool活動窗口標題:

$ xdotool getactivewindow getwindowname