Ich habe das gelöst, indem ich ein Python-Skript geschrieben habe. Wenn Sie es ausführen, können Sie eine Anwendung angeben, für die die Liste der Windows-IDs gesichert werden soll. Wenn Sie keine Anwendung angeben, werden alle Fenster ausgegeben.
Die Fenster werden in der Reihenfolge ihrer Präsentation ausgegeben, sodass alles, was oben in der Liste steht, das "höchste" Fenster ist (angeblich das aktuell aktive, wenn es sichtbar ist).
Beispielausgabe
bloop:~ r$ ./wlist2 Chrom
9040 0 "Chromium" "terminal - How do I find the windowid of Google Chrome to pass to screencapture -l - Ask Different"
9039 0 "Chromium" ""
So erfassen Sie einen Bildschirm automatisch aus einem Shell-Skript
screencapture -l $(./wlist2 Chrom | head -1 | awk '{print $1}') out.png
Skript:
#!/usr/bin/python2.6
from itertools import chain
from Quartz import CGWindowListCreate as create_list
from Quartz import CGMainDisplayID as display_id
from Quartz import CGWindowListCreateDescriptionFromArray as lookup
import sys
class Windows(list):
def find(self, name):
for window in self:
if window.IsOnscreen and window.OwnerName.find(name) > -1:
print window
def dump(self):
for window in self:
if window.IsOnscreen:
print window
def __getitem__(self, item):
result = list.__getitem__(self, item)
try:
return Windows(result)
except TypeError:
return result
class Window(object):
key_list = []
def __init__(self, kwargs):
for k in kwargs.keys():
setattr(self, k.replace('kCGWindow',''), kwargs[k])
self.key_list.append(k.replace('kCGWindow',''))
def __repr__(self):
t = '%d %d "%s" "%s"' % (
getattr(self, 'Number', -1),
getattr(self, 'Layer', -1),
getattr(self, 'OwnerName', None),
getattr(self, 'Name', None)
)
return t.encode('utf-8')
wlist=Windows()
for x in lookup(create_list(display_id(), 0)):
wlist.insert(0, Window(dict(x)) )
if len(sys.argv) > 1:
wlist.find(sys.argv[1])
else:
wlist.dump()