2010-10-21 68 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