2010-07-30 4 views
3

J'essaye d'obtenir un répertoire courant d'une fenêtre de recherche qui est mise au point à partir d'une autre application de cacao qui s'exécute dans un arrière-plan. Je sais que cela peut être fait en utilisant un AppleScript comme:Récupère le répertoire actuel d'une fenêtre du Finder à partir d'une application de cacao

tell application "Finder" 
try 
    set dir to (the target of the front window) as alias 
on error 
    set dir to startup disk 
end try 
end tell 

Cependant, je me demandais s'il y a une manière plus générique de le faire soit en utilisant l'API d'accessibilité ou d'un autre script de l'interface avec System Event peut-être?

J'ai essayé des attributs comme NSAccessibilityDocumentAttribute ou NSAccessibilityURLAttribute mais aucun n'est défini. D'autres applications basées principalement sur des documents fonctionnent plutôt bien, mais pas pour finder ni pour terminal.app.

+0

@ regulus6633 (je peux ajouter un commentaire directement sur votre poste afin que je puisse l'ajouter) Merci à votre poste, mais de même à Brian Webster, ma question n'a pas été la façon d'exécuter applescript depuis le cacao, mais il s'agit d'une façon générique d'obtenir un répertoire de travail courant à partir d'une application comme l'application finder ou l'application terminale en utilisant l'API d'accessibilité ou applescript. À l'heure actuelle, je pense que tout cela doit être traité comme un cas particulier. – fikovnik

Répondre

2

Jetez un oeil à la Scripting Bridge framework, qui va probablement être le moyen le plus facile d'obtenir les informations que vous voulez directement à partir de votre application Cocoa.

+0

Comme je n'ai plus de voix, je vais donner un +1 à la réponse. – kiamlaluno

+0

Je suppose que j'aurais dû m'exprimer mieux. Je sais comment exécuter applescript à partir de cacao, la question était de savoir s'il existe un moyen d'obtenir le répertoire actuel d'une API d'accessibilité finder ou s'il existe un moyen plus générique d'obtenir cette information. – fikovnik

1

@nkuyu, je viens de voir votre commentaire que vous savez comment exécuter un applescript ... mais pour les autres qui ne le font pas (et pourrait trébucher sur ce post) je vais vous expliquer.

Il est facile d'exécuter un applescript depuis objc en utilisant NSApplescript. Et si vous renvoyez une chaîne de votre applescript, il est encore plus facile d'obtenir un résultat car vous pouvez obtenir le "stringValue" du NSAppleEventDescriptor. En tant que tel, je renvoie "chemins posix" de l'applescript. Notez que NSApplescript n'est pas compatible avec les threads. Dans les applications multi-thread, vous devez donc veiller à toujours l'exécuter sur le thread principal. Essayez ceci ...

-(IBAction)runApplescript:(id)sender { 
    [self performSelectorOnMainThread:@selector(getFrontFinderWindowTarget) withObject:nil waitUntilDone:NO]; 
} 

-(void)getFrontFinderWindowTarget { 
    NSString* theTarget = nil; 
    NSString* cmd = @"tell application \"Finder\"\ntry\nset dir to the target of the front window\nreturn POSIX path of (dir as text)\non error\nreturn \"/\"\nend try\nend tell"; 
    NSAppleScript* theScript = [[NSAppleScript alloc] initWithSource:cmd]; 

    NSDictionary* errorDict = nil; 
    NSAppleEventDescriptor* result = [theScript executeAndReturnError:&errorDict]; 
    [theScript release]; 
    if (errorDict) { 
     theTarget = [NSString stringWithFormat:@"Error:%@ %@", [errorDict valueForKey:@"NSAppleScriptErrorNumber"], [errorDict valueForKey:@"NSAppleScriptErrorMessage"]]; 
    } else { 
     theTarget = [result stringValue]; 
    } 
    [self getFrontFinderWindowTargetResult:theTarget]; 
} 

-(void)getFrontFinderWindowTargetResult:(NSString*)result { 
    NSLog(@"result: %@", result); 
} 
3
// this is the finder 
    FinderApplication * finder = [SBApplication applicationWithBundleIdentifier:@"com.apple.Finder"]; 
    // get all the finder windows 
    SBElementArray * finderWindows = finder.FinderWindows; 
    // this is the front window 
    FinderWindow * finderWindow = finderWindows[0]; 
    // this is its folder 
    FinderFolder * finderFolder = finderWindow.properties[@"target"]; 
    // this is its URL 
    NSString * finderFolderURL = finderFolder.URL; 
    NSLog(@"front window URL: %@", finderFolderURL); 
+0

Est-ce que tout cela fonctionnera aussi sous sandbox? Je me souviens avoir lu sur les restrictions quand il s'agit de Apple Événements/Script – cacau

+0

Vous devrez peut-être ajouter les droits appropriés ... – geowar

+0

Où est FinderApplication, FinderWindow et FinderFolder défini? Aucun résultat n'est renvoyé lors de la recherche dans la documentation Xcode ou sur le site Web Apple Developer. En outre, la ligne d'installation SBApplication renvoie une instance SBApplication pas un FinderApplication. Au moins c'est le cas sur mon Xcode 8.0 ... – Todd

Questions connexes