Получить текущий каталог окна Finder из приложения какао - PullRequest
3 голосов
/ 30 июля 2010

Я пытаюсь получить текущий каталог окна поиска, который находится в фокусе, от другого приложения какао, которое работает в фоновом режиме.Я знаю, что это можно сделать с помощью яблочного сценария, например:

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

Однако мне было интересно, есть ли какой-то более общий способ сделать это либо с помощью API специальных возможностей, либо с помощью других сценариев пользовательского интерфейса с использованием, возможно, System Event?

Я пробовал атрибуты типа NSAccessibilityDocumentAttribute или NSAccessibilityURLAttribute, но ни один не установлен.Из других приложений, основанных главным образом на документах, это работает довольно хорошо, но не для поиска и для Terminal.app.

Ответы [ 3 ]

3 голосов
/ 12 января 2015
    // 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);
2 голосов
/ 31 июля 2010

Взгляните на Scripting Bridge framework , это, вероятно, будет самый простой способ получить необходимую информацию прямо из вашего приложения Cocoa.

1 голос
/ 02 августа 2010

@ nkuyu, я только что увидел ваш комментарий, что вы знаете, как запустить appleScript… но для тех, кто не (и может наткнуться на этот пост), я объясню.

Легко запустить яблочный скрипт из объекта с помощью NSApplescript. И если вы возвращаете строку из вашего appleScript, то еще проще получить результат, потому что вы можете получить "stringValue" из NSAppleEventDescriptor. В качестве такового я возвращаю «пути посикса» из appleScript. Обратите внимание, что NSApplescript не является поточно-ориентированным, поэтому в многопоточных приложениях вы должны всегда запускать его в главном потоке. Попробуйте это ...

-(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);
}
...