Question

Comment puis-je obtenir le chemin POSIX de la fenêtre du Finder qui se trouve actuellement en haut de sa liste de fenêtres? De préférence avec une sorte d’encadrement Cocoa mais je suis ouvert à tout.

Contexte: J'aurais besoin de cela parce que je veux faire une sélection de fichiers correspondant à un motif regex, en partant de manière récursive à partir de ce chemin. L'idée est d'utiliser

[[NSWorkspace sharedWorkspace] subpathsAtPath:thePath]

pour obtenir tous les descendants de ce chemin, utilisez & "; grep &"; dans un NSTask (pour éviter de conditionner un framework de support regex) et utilisez

[[NSWorkspace sharedWorkspace] selectFile:aFile inFileViewerRootedAtPath:thePath]

dans une boucle en boucle dans un NSArray créé à partir des entrées renvoyées par grep.

Jusqu'à présent, j'ai examiné NSWorkspace, NSFileManager et NSApplication, ainsi que d'autres recherches par mot clé dans la documentation Xcode.

Merci d'avoir vérifié ma question!

André

PS: Je ne suis pas sûr de la partie grep, peut-être que je vais simplement y mettre RegexKit Lite…

Était-ce utile?

La solution

Je développe une application commerciale qui correspond exactement à ce que vous décrivez et cela fait maintenant plus d'un an que je m'occupe de différentes façons de le faire. Je suis un développeur débutant. Je suis donc tout à fait ouvert à l'idée qu'il existe peut-être un meilleur moyen de le faire que le mien, mais cela semble stable et efficace.

J'utilise Apple Script

Je reçois le chemin du document actif toutes les 3 secondes, mais si l'application active est le Finder, je reçois le chemin de la fenêtre active. Je le fais en utilisant Apple Script comme décrit dans la réponse acceptée.

Obtenir une liste de fenêtres à l'aide de carbone

Pour obtenir la liste des fenêtres de tous les processus et obtenir l'ID de la fenêtre (ce que Apple Script ne peut pas faire), j'utilise CGWindowListCopyWindowInfo comme indiqué dans cette question:

Obtenir un identifiant unique pour une fenêtre d'une autre application

Ceci me présente un tableau avec toutes les fenêtres de tous les processus ordonnés selon ce qui est au premier plan. Donc, tout ce que je dois faire est de cueillir la première entrée du tableau. Cela peut également être utilisé pour obtenir une capture d'écran de la fenêtre avant, si cela vous est utile, comme le montre l'exemple d'application Son of Grab, qui m'a été d'une aide inestimable.

Envoi d'un script Apple à partir de Cocoa

En ce qui concerne Apple Script, j’ai expérimenté les trois propositions suggérées par Jim et ma conclusion est que chacune d’entre elles présente des problèmes, à la fois en termes de stabilité et de flexibilité.

  1. Apple Event Manager compte sur vous envoi d'événements Apple bruts. Pour moi, c'était trop comme un travail acharné et niveau trop bas.

  2. Utiliser NSAppleScript que j'ai trouvé lent et sujet aux erreurs. C'est aussi assez maladroit quand vous voulez envoyer un toute la variété de Apple Script messages comme je le fais.

  3. Lors de la lecture de Scripting Bridge, Je suis très excité, seulement pour l'essayer sortir et être très déçu. Pour le attributs des fenêtres j'étais en essayant de saisir, il n'a même pas les reconnaître comme existant. Il semblait à moi d'être buggy et bizarre. Je m'attends à si les commandes que vous envoyez sont soutenu par SB, ce serait le meilleur option.

Une quatrième option

Je me base maintenant sur un fabuleux wrapper Objective C pour Apple Script appelé AppScript . Il existe depuis de très nombreuses années, il est stable, le développeur est excellent et surtout, il fonctionne.

Il possède des méthodes extrêmement solides qui vous permettent d’envoyer Apple Script. Il vous renverra même les erreurs sans aucun chargement de code potentiellement bogué et compliqué nécessitant une vérification.

Je l'utilise depuis un an maintenant sans aucun problème. Si vous avez d'autres questions sur la manière de procéder, n'hésitez pas à commenter et je ferai de mon mieux pour y répondre.

Autres conseils

Vous pouvez probablement demander cela au Finder via un AppleScript.

Ce * one-liner fonctionne pour moi:

osascript -e 'tell application "Finder" to set myname to POSIX path of (target of window 1 as alias)'

* une version modifiée de this .

Obtenir le chemin POSIX représenté par la fenêtre la plus en avant du Finder va impliquer l'envoi d'événements Apple au Finder d'une manière ou d'une autre.

Vos choix incluent:

  • Utiliser directement le gestionnaire d'événements Apple (ou NSAppleEventDescriptor et ses amis).
  • Utilisation d'objets NSAppleScript ou OSAScript.
  • Utilisation de ScriptingBridge.

Si vous construisez une application Cocoa, OSAScript est probablement le choix le plus naturel.

Il est possible d’utiliser le ScriptingBridge avec Swift 4

import Foundation
import ScriptingBridge // imports: ScriptingBridge.SBApplication, .SBElementArray, .SBObject

// SBApplication? to SBApplication to FinderApplication
let finder = (SBApplication(bundleIdentifier: "com.apple.finder")!) as FinderApplication

let windowList: SBElementArray = finder.windows!()
guard windowList.count > 0,
    let window = windowList[0] as? FinderWindow,
    let windowProperties = window.properties,
    let windowTarget = windowProperties["target"] as? FinderFolder,
    let windowUrlOptionalStr = windowTarget.URL,
    let windowUrlSubStr = windowUrlOptionalStr
        .removingPercentEncoding?
        .dropFirst(7) // "file://" 7 characters
else {
    // … handle failure
}

let windowUrl = URL(
    fileURLWithPath: String(windowUrlSubStr),
    isDirectory: true,
    relativeTo: nil)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top