Получить активное название окна в 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" 

2 Solutions collect form web for “Получить активное название окна в X”

xdotool может это сделать.

xdotool getactivewindow

Я немного изменил ваше решение, чтобы он работал более эффективно (он передает параметры xprop, поэтому возвращаются только те данные, которые ему нужны). Кроме того, я не уверен, что необходимо буферировать вывод xprop, поэтому я взял это. Он также должен исправить возврат «Active window not found», если по какой-то причине он не может найти активное окно.

 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" 
  • QSettings (): как сохранить текущий каталог
  • Как нарисовать линию с анимацией в PyQt4
  • PyQt Webkit и html-формы: выборка окна вывода и закрытия
  • Элементы исчезают из поля со списком, когда я читаю их из модели
  • PyQt / PySide - отображение значков
  • как передать аргументы функции с использованием предопределенного СИГНАЛА в PyQT
  • Значение Matplotlib не обновляется при изменении данных
  • Несколько файлов И выбор папок в QFileDialog?
  •  
    Interesting Posts for Van-Lav

    В чем разница между json.dumps и json.load?

    Может ли AngularJS ng-include загружать обработанный html Jinja2 на FLASK?

    Статические файлы Django не отображаются на рабочем сервере. Как я могу правильно их отобразить, поэтому я вижу графический интерфейс администратора

    Обработка rss-перенаправлений с помощью Python / urllib2

    Выполнение баланса кредитной карты в Python

    Что такое питоновский способ инъекции зависимостей?

    Как исправить «Попытка относительного импорта в не-пакет» даже с __init__.py

    Как создать django-сообщения StackOverflow?

    Как можно использовать глупый или наглядный вид из киви?

    Как обрабатывать две формы в одном представлении?

    Динамическая инстанция Python из имени строки класса в динамически импортированном модуле

    Разве «не в в c» отличается от «e не в c» в Python?

    Multiplex on queue.Queue?

    ValueError: элемент последовательности обновления словаря # 0 имеет длину 1; 2 требуется

    Python: generic webbrowser.get (). Open () для chrome.exe не работает

    Python - лучший язык программирования в мире.