Come trovo il windowid di Google Chrome da passare a screencapture -l [duplicato]

7

Vorrei utilizzare screencapture -l per creare schermate automatiche di Google Chrome. Questo richiede conoscere il windowid del processo di Google Chrome in esecuzione.

Per le app che supportano Applescript, questa domanda ha la risposta. Ma questa soluzione non funziona per le app che non sono scriptable, come Google Chrome.

C'è un modo per recuperare il windowid da un processo di Google Chrome in esecuzione da uno script Python? So che l'app Quartz Debug può farlo, ma questa è un'app GUI, quindi non può essere invocata tramite script.

    
posta Lorin Hochstein 05.12.2012 - 21:52
fonte

2 risposte

2

Ho risolto questo problema scrivendo uno script python. Quando lo esegui puoi specificare un'applicazione per scaricare l'elenco degli ID di Windows, oppure se non specifichi alcuna applicazione, scaricherà tutte le finestre.

Le finestre sono oggetto di presentazione, quindi qualunque cosa sia in cima alla lista è la finestra 'più alta' (apparentemente quella attualmente attiva se è visibile)

Esempio di output

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" ""

Come usarlo per acquisire automaticamente uno schermo da uno script di 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()
    
risposta data 22.05.2013 - 20:25
fonte
4

Puoi farlo con GrabFS , un file system di screenshot per OS X. (Scarica in fondo a la pagina. Funziona bene per me su 10.8.2 con OSXFUSE ) Ti dà le trame di tutte le finestre di processi come file che puoi semplicemente copiare . Per aggiornare lo screenshot, copia di nuovo.

Sembra questo (convertito da TIFF in PNG per risparmiare spazio.): Probabilmente dovrai fare un piccolo script di shell per automatizzarlo, ma sarà facile.

    
risposta data 06.12.2012 - 17:06
fonte

Leggi altre domande sui tag