Я работаю с мультитачем и пытаюсь делать разные вещи в разных приложениях с помощью одних и тех же жестов.
У меня есть скрипт на Python, базовый работает.
Бот как мне выбрать между приложениями? Как получить заголовок активного окна?
Спасибо
Редактировать информацию о системе:
- Питон 2.7.6
- Ubuntu 14.04 (Единство)
решение1
Ниже обновленная версия. Я оставлю старый ответ, чтобы не удалять ответ, который получил голоса.
#!/usr/bin/env python3
import gi
gi.require_version("Wnck", "3.0")
from gi.repository import Wnck
scr = Wnck.Screen.get_default()
scr.force_update()
print(scr.get_active_window().get_name())
или получить xid:
print(scr.get_active_window().get_xid())
или (что не очень удивительно) получить pid:
print(scr.get_active_window().get_pid())
Также смотрите здесь, чтобы получитьМетоды Wnck.Window.
Старый ответ:
Я бы просто проанализировал вывод либо xprop
, либо xwit
и (возможно, вам сначала wmctrl
придется установить : ). xprop даетwmctrl
sudo apt-get install wmctrl
многоинформации на окнах.
xprop -root
дает вам информацию об активном окне, а также идентификатор окна и
wmctrl -l
дает вам список открытых в данный момент окон. Использование -p
опции также дает вам информацию о pid, к которым принадлежат окна. В совокупности вы можете получить всю необходимую информацию.
например:
В Python 3, используя подпроцесс check_output():
Чтобы получить активное окно (id):
-с использованием xprop
# [1]
import subprocess
command = "xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //'"
frontmost = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip()
print(frontmost)
> 0x38060fd
-используя xprop, анализируя его «внутри» python
# [2]
import subprocess
command = "xprop -root _NET_ACTIVE_WINDOW"
frontmost = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip().split()[-1]
print(frontmost)
> 0x38060fd
Получив идентификатор окна, с помощью wmctrl получаем идентификатор процесса (pid) приложения, к которому оно принадлежит:
Примечание: во-первых, нам нужно «исправить» самый первый идентификатор (вывод) команды выше для wmctrl; идентификатор из wmctrl и xprop немного отличается:
0x381e427 (xprop)
0x0381e427 (wmctrl)
чтобы исправить вывод функции выше (используя «самый передний» вывод # [1]
или # [2]
):
fixed_id = frontmost[:2]+"0"+frontmost[2:]
затем получите pid (приложения) самого переднего окна:
command = "wmctrl -lp"
window_pid = [l.split()[2] for l in subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").splitlines() if fixed_id in l][0]
> 6262
В Python 2, используя subprocess.Popen():
В Python 2 subprocess.check_output недоступен, поэтому процедура немного отличается и более многословна:
Чтобы получить активное окно (id):
-с использованием xprop
# [1]
import subprocess
command = "xprop -root _NET_ACTIVE_WINDOW"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
frontmost = output.communicate()[0].decode("utf-8").strip().split()[-1]
print frontmost
> 0x38060fd
чтобы получить (pid) приложения, к которому он принадлежит, используя wmctrl и вывод# [1]
-(снова) используем (и исправляем) вывод [1]
:
# [2]
import subprocess
fixed_id = frontmost[:2]+"0"+frontmost[2:]
command = "wmctrl -lp"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
window_pid = [l.split()[2] for l in output.communicate()[0].decode("utf-8").splitlines() if fixed_id in l][0]
print window_pid # pid of the application
> 6262
чтобы получить окноимя, используя wmctrl
и вывод # [1]
(также используя socket.gethostname()
для разделения вывода wmctrl
по имени машины)
# [3]
import subprocess
import socket
command = "wmctrl -lp"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
window_list = output.communicate()[0].decode("utf-8")
window_name = [l for l in window_list.split("\n") if fixed_id in l][0].split(socket.gethostname()+" ")[-1]
print window_name