Je souhaite utiliser l'API d'accessibilité pour obtenir une liste de toutes les fenêtres d'une application donnée (externe).
L'objectif est de vérifier si une certaine fenêtre est ouverte. D'abord, je vérifie que l'application est en cours d'exécution (à l'aide de [Nsworkspace WorkingPlications] et en vérifiant chacun), puis je souhaite vérifier le texte de la barre de titre de chaque fenêtre ouverte pour cette application. P>
PS p>
afin que je puisse créer un élément pour l'application à l'aide du PID: p> mais que dois-je faire avec ça? Est-ce que je vais même dans la bonne direction? Ne peut pas croire qu'il est si difficile de trouver des exemples à ce sujet. P> p>
4 Réponses :
Vous pouvez utiliser WindowswithOptions: . Il répertorie toutes les fenêtres de toutes les applications par leur numéro. Mais je ne trouve pas comment obtenir un NSWINDOW à partir d'un numéro de fenêtre ... P>
Vous ne pouvez pas, même en principe, obtenir un nswindow à partir d'un numéro de fenêtre, car le principe est que vous le faites à partir d'une application externe, c'est-à-dire un autre processus, et chaque point de signature Nswindow * est dans l'espace d'adresses du processus qui possède la fenêtre. Le numéro de la fenêtre est l'index Le serveur de fenêtre utilise et fournit afin que toute application puisse faire des choses comme des instantanés d'écran de demande.
Je ne sais pas un moyen d'obtenir une carte d'identité de la fenêtre et du PID de l'API d'accessibilité.
La méthode Nswindow Laurent mentionnée ne fournit que des ID de fenêtre mais pas le PID de la fenêtre Propriété de la fenêtre.
J'utiliserais les méthodes CGWindowlist disponibles depuis 10.5.
Pour obtenir une liste des identifiants de la fenêtre et le PID du propriétaire, vous pouvez essayer ce que vous pouvez essayer ce qui suit:
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); for (NSMutableDictionary* entry in (NSArray*)windowList) { NSString* ownerName = [entry objectForKey:(id)kCGWindowOwnerName]; NSInteger ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] integerValue]; NSLog(@"%@:%d", ownerName, ownerPID); } CFRelease(windowList);
Est-ce que cela fonctionne aussi à Swift? Semble qu'il n'y a pas d'équivalent de kcgnullwindowid code> à Swift ...
@Blaszard La constante existe sous la forme d'origine dans Swift - KCGnullWindowID code>
Utiliser Comme vous pouvez deviner de son nom de fonction, il suit Copier la règle . p> AXUIELYECOPYATTRIBUTEVALUES CODE> Pour copier la valeur pour
KAXWindowsAttribute code>, qui doit être une matrice d'objets d'axe sélectionnés représentant les fenêtres de l'application. P>
Belle indice, Peter. Mais ... cela n'a pas fonctionné pour moi et j'ai enfin découvert que j'ai toujours eu kaxerrrorcannotcomplete code> en essayant d'obtenir
axuielementcopyattributenames code> (je reçois le
axuielementref code> comme sur la question initiale, serait-ce le problème ?!).
@Stuffmc: Je suggère de poser une question distincte et / ou de déposer un bug.
Un autre exemple de la raison pour laquelle nous ne laissons pas tomber un lien dans une réponse. Quelle est la règle de la copie? Cliquez sur le lien pour ne pas savoir.
Cela fonctionne pour moi à Swift 5.1:
let windowList: CFArray? = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) for entry in windowList! as Array { let ownerName: String = entry.object(forKey: kCGWindowName) as? String ?? "N/A" let ownerPID: Int = entry.object(forKey: kCGWindowOwnerPID) as? Int ?? 0 print("ownerName: \(ownerName), ownerPID:\(ownerPID)") }