2017-05-28 7 views
2

Die folgende Python-2-Code druckt Liste aller Fenster im aktuellen Arbeitsbereich:Wie listet man alle Fenster aus allen Arbeitsbereichen in Python auf dem Mac auf?

#!/usr/bin/python 
import Quartz 
for window in Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID): 
    print("%s - %s" % (window['kCGWindowOwnerName'], window.get('kCGWindowName', u'Unknown').encode('ascii','ignore'))) 

Obwohl es nicht die Anwendungen nicht gedruckt werden, die in vollem Umfang nutzen sind (wie es in einem anderen Arbeitsbereich ist).

Wie ändere ich oben Skript, um alle Fenster von allen Desktops aufzulisten?

Antwort

2

Das folgende Skript sollte Fenster Informationen zurückgeben auf jeden Desktop/Arbeitsbereich/Display, Vollbild und detaillierte Informationen (Koordinaten, pid, Titel, usw.):

#!/usr/bin/python 

import Quartz 
import time 
from Quartz import CGWindowListCopyWindowInfo, kCGWindowListExcludeDesktopElements, kCGNullWindowID 
from Foundation import NSSet, NSMutableSet 

def windowList(wl): 
    for v in wl: 
     print ( 
     str(v.valueForKey_('kCGWindowOwnerPID') or '?').rjust(7) + 
      ' ' + str(v.valueForKey_('kCGWindowNumber') or '?').rjust(5) + 
      ' {' + ('' if v.valueForKey_('kCGWindowBounds') is None else ( 
        str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('X')))  + ',' + 
        str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Y')))  + ',' + 
        str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Width'))) + ',' + 
        str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Height'))) 
       )).ljust(21) + '}' + 
      '\t[' + ((v.valueForKey_('kCGWindowOwnerName') or '') + ']') + 
      ('' if v.valueForKey_('kCGWindowName') is None else (' ' + 
      v.valueForKey_('kCGWindowName') or '')) 
     ).encode('utf8') 

wl1 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID) 
print('Move target window (or ignore)\n') 
time.sleep(5) 

print('PID'.rjust(7) + ' ' + 'WinID'.rjust(5) + ' ' + 'x,y,w,h'.ljust(21) + ' ' + '\t[Title] SubTitle') 
print('-'.rjust(7,'-') + ' ' + '-'.rjust(5,'-') + ' ' + '-'.ljust(21,'-') + ' ' + '\t-------------------------------------------') 

wl2 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID) 

w = NSMutableSet.setWithArray_(wl1) 
w.minusSet_(NSSet.setWithArray_(wl2)) 

wl = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID) 
wl = sorted(wl, key=lambda k: k.valueForKey_('kCGWindowOwnerPID')) 

windowList(wl) 

print('\nDetailed window information: {0}\n'.format(w)) 
1

Der Schlüssel ist hier das Recht zur Nutzung Option für das erste Argument von CGWindowListCopyWindowInfo. Abgesehen von der Verwendung der Eigenschaft optionOnScreenOnly (die alle derzeit auf dem Bildschirm angezeigten Fenster auflistet), muss die Eigenschaft excludeDesktopElements hinzugefügt werden.

excludeDesktopElements: Schließen Sie alle Fenster aus der Liste, die Elemente des Desktops sind, einschließlich der Hintergrundbild und Desktop-Icons.

z.

list = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements & kCGWindowListOptionOnScreenOnly, kCGNullWindowID) 

Alternativ für alle Fenster können kCGWindowListOptionAll Eigenschaft verwendet werden.

kCGWindowListOptionAll: Alle Fenster auflisten, einschließlich der Bildschirm- und Offscreen-Fenster. Beim Abrufen einer Liste mit dieser Option sollte der Parameter relativeToWindow auf kCGNullWindowID gesetzt werden.

Für andere Eigenschaften, überprüfen Sie CGWindow.h in CoreGraphics.

#!/usr/bin/python 
# Prints list of all windows. 
# See: https://stackoverflow.com/q/44232433/55075 
import Quartz 
for window in Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionOnScreenOnly & Quartz.kCGWindowListExcludeDesktopElements, Quartz.kCGNullWindowID): 
    print("%s - %s" % (window['kCGWindowOwnerName'], window.get('kCGWindowName', u'Unknown').encode('ascii','ignore'))) 
:


So der ursprüngliche Code kann geändert werden

Verwandte Themen