Я работаю с мультисенсорным, и я пытаюсь сделать другой материал на различных приложениях теми же жестами.
У меня есть сценарий Python, основные работы.
Бот, как я могу решить между приложениями? Как получить заголовок активного окна?
Спасибо
Информация о системе редактирования:
Ниже обновленной версии. Я оставлю старый ответ, для не удаления ответа, который получил голоса.
#!/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. Методы окна.
Я просто проанализировал бы вывод также xprop
или xwit
и wmctrl
(Вам, возможно, придется установить wmctrl
во-первых: sudo apt-get install wmctrl
). xprop дает большую информацию об окнах.
xprop -root
дает Вам информацию об активном окне, a.o. идентификатор окна, и
wmctrl -l
дает Вам список в настоящее время открываемых окон. Используя -p
опция также дает Вам информацию о pids, которому принадлежат окна. Объединенный можно получить всю информацию, в которой Вы нуждаетесь.
например:
Получить активное окно (идентификатор):
- использование 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
После того как мы имеем идентификатор окна, добираемся (pid) приложение, это принадлежит, с помощью wmctrl:
NB: сначала, мы должны "исправить" frontmost идентификатор (вывод) команды выше для wmctrl; идентификатор от wmctrl и xprop немного отличается:
0x381e427 (xprop)
0x0381e427 (wmctrl)
зафиксировать вывод функции выше (использование "frontmost" вывода # [1]
или # [2]
):
fixed_id = frontmost[:2]+"0"+frontmost[2:]
затем получите pid (приложение) frontmost окно:
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.check_output не доступен, таким образом, процедура немного отличается и является более подробной:
Получить активное окно (идентификатор):
- использование 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