Ho risolto questo problema scrivendo uno script python. Quando lo esegui, puoi specificare un'applicazione per cui eseguire il dump dell'elenco di ID di Windows, o se non specifichi alcuna applicazione, scaricherà tutte le finestre.
Le finestre vengono scaricate in ordine di presentazione, quindi qualunque cosa si trovi in cima alla lista è la finestra "più in alto" (apparentemente quella attualmente attiva se è visibile)
Esempio di output
bloop: ~ r $ ./wlist2 Chrom9040 0 "Chromium" "terminal - Come trovo il windowid di Google Chrome da passare a screencapture -l - Ask Different" 9039 0 "Chromium" ""
Come usarlo per catturare automaticamente una schermata da uno script di shell
screencapture -l $ (./ wlist2 Chrom | head -1 | awk ' {print $ 1} ') out.png
Script:
#! / usr / bin / python2.6 da ittools import chainfrom Quartz import CGWindowListCreate as create_listfrom Quartz import CGMainDisplayID come display_id da Quartz import CGWindowListCreateDescriptionFromArray come lookupimport sysclass Windows (list): def find (self, name): for window in self: if window.IsOnscreen and window.OwnerName.find (name) > -1: print window def dump (sel f): for window in self: if window.IsOnscreen: print window def __getitem __ (self, item): result = list .__ getitem __ (self, item) try: return Windows (result) eccetto TypeError: return resultclass 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. sostituire ('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]) altro: wlist.dump ()