Alte Antwort:

Alte Antwort:

Ich arbeite mit Multitouch und versuche, mit denselben Gesten unterschiedliche Dinge in unterschiedlichen Anwendungen zu tun.

Ich habe ein Python-Skript, das grundlegend funktioniert.

Aber wie entscheide ich mich zwischen den Anwendungen? Wie erhalte ich den aktiven Fenstertitel?

Danke

Systeminformationen bearbeiten:

  • Python 2.7.6
  • Ubuntu 14.04 (Unity)

Antwort1

Nachfolgend die aktualisierte Version. Ich lasse die alte Antwort stehen, um die Antwort, die die Stimmen bekommen hat, nicht zu entfernen.

#!/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())

oder holen Sie sich xid:

print(scr.get_active_window().get_xid())

oder (nicht sehr überraschend) get pid:

print(scr.get_active_window().get_pid())

Siehe auch hier, umWnck.Window-Methoden.


Alte Antwort:

Ich würde einfach die Ausgabe von entweder xpropoder xwitund analysieren wmctrl(Sie müssen möglicherweise wmctrlzuerst installieren sudo apt-get install wmctrl:). xprop gibteine Mengevon Informationen zu Fenstern.

xprop -root

gibt Ihnen Informationen über das aktive Fenster, ua die Fenster-ID und

wmctrl -l

gibt Ihnen eine Liste der aktuell geöffneten Fenster. Wenn Sie diese -pOption verwenden, erhalten Sie auch Informationen zu den PIDs, zu denen die Fenster gehören. In Kombination erhalten Sie alle Informationen, die Sie benötigen.

Zum Beispiel:

In Python 3 mithilfe des Unterprozesses check_output():

So erhalten Sie das aktive Fenster (ID):

-mit 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

-mit xprop, Parsen "innerhalb" von 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

Sobald wir die Fenster-ID haben, holen Sie sich mit wmctrl die (PID) der Anwendung, zu der sie gehört:

NB: Zuerst müssen wir die vorderste ID (Ausgabe) des obigen Befehls für wmctrl „korrigieren“. Die ID von wmctrl und xprop unterscheidet sich geringfügig:

0x381e427 (xprop)
0x0381e427 (wmctrl)

um die Ausgabe der obigen Funktion zu korrigieren (unter Verwendung der „vordersten“ Ausgabe von # [1]oder # [2]):

fixed_id = frontmost[:2]+"0"+frontmost[2:]

dann holen Sie sich die PID des (der Anwendung des) vordersten Fensters:

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


In Python 2 mit subprocess.Popen():

In Python 2 ist subprocess.check_output nicht verfügbar, daher ist das Verfahren etwas anders und etwas ausführlicher:

So erhalten Sie das aktive Fenster (ID):

-mit 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

um die (PID der) Anwendung zu erhalten, zu der es gehört, mit wmctrl und der Ausgabe von# [1]

-(erneut) Verwenden (und Korrigieren) der Ausgabe von [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

um das Fenster zu bekommenName, mit wmctrlund der Ausgabe von # [1] (auch mit socket.gethostname()zum Aufteilen der Ausgabe von wmctrlnach Maschinennamen)

# [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

Mann xprop
Mann wmctrl
Mann xwit

verwandte Informationen