找到当前活动的Finder窗口/文件夹

时间:2011-06-04 16:35:55

标签: objective-c cocoa

有没有办法在Finder中确定当前活动的窗口或文件夹?在某种意义上,我需要这个来确定一个适当的“默认”位置,以便在我的应用中执行某些特定的操作。

实际上,这个问题是否有意义?这个“当前活动的Finder窗口/文件夹”的概念是否首先存在?如果没有,请问如何获取当前已选择的 Finder项目。

2 个答案:

答案 0 :(得分:6)

是的,当前活动的Finder窗口的概念确实存在,以及当前选择的项目。

例如,以下AppleScript获取selection,它是最前面窗口中的当前选择。由于这会返回一个文件或文件夹列表,即使只有一个项目,下一行也会从该列表中获取第一个项目(在确保列表的计数大于0之后)。然后,您可以向Finder询问所选项目的container window,这将返回Finder window个对象。

tell application "Finder"
    set selectedItems to selection

    if ((count of selectedItems) > 0) then
        set selectedItem to (item 1 of selectedItems) as alias
        container window of selectedItem
    end if

end tell

我很确定发布的sidyll代码在10.5及更早版本中可以正常工作,但由于AppleScript似乎从一个版本的OS X到下一个版本的不可避免的变化和怪癖,它在10.6中出错了

[编辑]实际上,我只知道发生了什么。 我通常一直打开Finder的Inspector窗口(通过Command-Option-i获得的动态Get Info窗口),右上图显示在下面的图片中:

enter image description here

该图像显示了3种不同的窗口类别:

1)左上角是Get Info窗口,是information window,它继承自通用window类。

2)右上角是一个Inspector窗口,是一个普通的window

3)下图显示Finder window,它继承自通用window类。

如果我使用上面显示的窗口设置运行以下脚本:

tell app "Finder"
    every window
end tell

它返回以下结果:

   { 窗口 “mdouma46 应用程序的信息   “Finder”, 信息窗口 “mdouma46   信息“应用程序”Finder“, Finder   应用程序的窗口 ID 1141   “搜索”}

所以,在我的情况下发生的事情是,由于Inspector窗口是一个浮动的实用工具面板,如果它当前正在显示,向Finder询问window 1将始终返回Inspector面板,因为它始终是浮动的在其他窗户前面。

因此,运行代码时出现的错误是:

  

错误“无法制作«class fvtg»   应用程序窗口1“Finder”   到类型别名。“编号-1700来自   窗口1到别名的“class fvtg”

(换句话说,Inspector窗口,普通window,没有FileViewer目标(fvtg)属性;只有Finder window s)。

因此,只要用户没有Inspector窗口,Preferences窗口或最前面的Get Info窗口,您的代码就可以正常工作。但是,通过将window更改为Finder window,您可以确保只查看具有target属性的文件查看器窗口。

所以,就像这样:

NSDictionary *errorMessage = nil;

NSAppleScript *script = [[[NSAppleScript alloc] initWithSource:
    @"tell application \"Finder\"\n"
        " if ((count of Finder windows) > 0) then\n"
           "  return (POSIX path of (target of Finder window 1 as alias))\n"
        "end if\n"
     "end tell"] autorelease];

if (script == nil) {
    NSLog(@"failed to create script!");
    return nil;
}
NSAppleEventDescriptor *result = [script executeAndReturnError:&errorMessage];
if (result) {
    // POSIX path returns trailing /'s, so standardize the path
    NSString *path = [[result stringValue] stringByStandardizingPath];
    return path;
}

答案 1 :(得分:3)

我需要在过去的项目中执行此操作并重新使用AppleScript:

// Get path
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:
                        @"tell application \"Finder\"\n"
                         "  return POSIX path of (target of window 1 as alias)\n"
                         "end tell"];
NSDictionary *errors = nil;
NSAppleEventDescriptor *descriptor = [script executeAndReturnError:&errors];

if ((errors != nil) || (descriptor == nil)) {
    // There is no opened window or an error occured
} else {
    // what was retrieved by the script
    path = [descriptor stringValue];
}
[script release];