7 votes

Comment trouver le windowid de Google Chrome à passer à screencapture -l ?

J'aimerais utiliser screencapture -l pour réaliser des captures d'écran automatiques de Google Chrome. Pour cela, il faut connaître le windowid du processus Google Chrome en cours d'exécution.

Pour les applications qui prennent en charge Applescript, cette question a la réponse. Mais cette solution ne fonctionne pas pour les applications qui ne sont pas scriptables, comme Google Chrome.

Existe-t-il un moyen de récupérer l'identifiant de fenêtre d'un processus Google Chrome en cours d'exécution à partir d'un script Python ? Je sais que l'application Quartz Debug peut le faire, mais c'est une application GUI, donc elle ne peut pas être invoquée via script.

2voto

synthesizerpatel Points 204

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()

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X