Получить заголовок активного окна в X

Я пытаюсь получить заголовок активного окна. Приложение является фоновой задачей, поэтому, если у пользователя открыт Eclipse, функция возвращает «Eclipse - blabla», поэтому оно не получает заголовок моего собственного окна. Я разрабатываю это в Python 2.6 с использованием PyQt4.

Мое текущее решение, заимствованное и немного измененное из старого ответа здесь, в 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\"')

Оно работает для большинства окон, но не все. Например, он не может найти мои окна чата копейки или имя приложения, которое я сейчас разрабатываю.

Моя следующая попытка выглядит так:

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"
17
задан dutt 21 October 2010 в 04:54
поделиться