Resolví esto escribiendo un script en python. Cuando lo ejecute, puede especificar una aplicación para volcar la lista de ID de Windows, o si no especifica ninguna aplicación, se volcarán todas las ventanas.
Las ventanas se descargan ordenadas, por lo que lo que esté en la parte superior de la lista es la ventana "más alta" (aparentemente la que está activa actualmente si está visible)
Salida de ejemplo
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" ""
Cómo usar esto para capturar una pantalla automáticamente desde un script de shell
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()