J'ai résolu ce problème en écrivant un script en Python. Lorsque vous l'exécutez, vous pouvez spécifier une application pour laquelle la liste des identifiants Windows doit être extraite, ou si vous ne spécifiez aucune application, elle extraira tous les Windows.
Les fenêtres sont vidées dans l'ordre de présentation, de sorte que celle qui se trouve en haut de la liste est la fenêtre "la plus haute" (ostensiblement la fenêtre active si elle est visible).
Exemple de sortie
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" ""
Comment l'utiliser pour capturer automatiquement un écran à partir d'un shell script.
screencapture -l $(./wlist2 Chrom | head -1 | awk '{print $1}') out.png
script :
#!/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()