Estoy trabajando con multitáctil e intento hacer diferentes cosas en diferentes aplicaciones con los mismos gestos.
Tengo un script en Python, trabajos básicos.
Bot, ¿cómo puedo decidir entre las aplicaciones? ¿Cómo obtener el título de la ventana activa?
Gracias
Editar información del sistema:
- Pitón 2.7.6
- Ubuntu 14.04 (Unidad)
Respuesta1
A continuación la versión actualizada. Dejaré la respuesta anterior para no eliminar la respuesta que obtuvo los votos.
#!/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())
o obtener xid:
print(scr.get_active_window().get_xid())
o (no muy sorprendente) obtener pid:
print(scr.get_active_window().get_pid())
Consulte también aquí para obtenerMétodos Wnck.Window.
Antigua respuesta:
Simplemente analizaría la salida de o xprop
y xwit
( wmctrl
es posible que tengas que instalar wmctrl
primero sudo apt-get install wmctrl
:). xprop damuchode información en windows.
xprop -root
le brinda información sobre la ventana activa, así como la identificación de la ventana, y
wmctrl -l
le proporciona una lista de las ventanas abiertas actualmente. El uso de la -p
opción también le brinda información sobre los pids a los que pertenecen las ventanas. Combinados puedes obtener toda la información que necesitas.
Por ejemplo:
En Python 3, usando el subproceso check_output():
Para obtener la ventana activa (id):
-usando 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
-usando xprop, analizándolo "dentro" de 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
Una vez que tengamos el window-id, obtenemos el (pid de) la aplicación a la que pertenece, usando wmctrl:
NB: primero, tenemos que "arreglar" la identificación frontal (salida) del comando anterior para wmctrl; la identificación de wmctrl y xprop difiere ligeramente:
0x381e427 (xprop)
0x0381e427 (wmctrl)
para arreglar la salida de la función anterior (usando la salida "frontal" de # [1]
o # [2]
):
fixed_id = frontmost[:2]+"0"+frontmost[2:]
luego obtenga el pid de la (aplicación de la) ventana frontal:
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
En Python 2, usando subprocess.Popen():
En Python 2, subprocess.check_output no está disponible, por lo que el procedimiento es ligeramente diferente y un poco más detallado:
Para obtener la ventana activa (id):
-usando 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
para obtener el (pid de la) aplicación a la que pertenece, usando wmctrl y la salida de# [1]
-(nuevamente) usando (y arreglando) la salida de [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
para conseguir la ventananombre, usando wmctrl
y la salida de # [1]
(también usando socket.gethostname()
para dividir la salida de wmctrl
por nombre de máquina)
# [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