繁体   English   中英

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

[英]Find the currently active Finder window/folder

有没有办法在 Finder 中确定当前活动的 window 或文件夹? 在某种意义上,我需要它来确定一个适当的“默认”位置,在我的应用程序中执行一些特定的事情。

其实,这个问题还有意义吗? 这种“当前活动的 Finder 窗口/文件夹”的概念是否一开始就存在? 如果没有,请问如何获取当前选择的 Finder 项目。

是的,当前活跃的Finder window 的概念确实存在,当前选中的项目也是如此。

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

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 window 一直打开(通过 Command-Option-i 获得的动态 Get Info window),下图中的右上方面板:

在此处输入图像描述

该图像显示了 3 个不同类别的 windows:

1)左上角,一个Get Info window,是一个information window ,它继承自通用的window ZA2F2ED4FDC40ABBDDZC21。

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

3) 下图显示了一个Finder window ,它继承自通用window class。

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

tell app "Finder"
    every window
end tell

它返回以下结果:

{ 应用程序“Finder”的window “mdouma46 Info”,应用程序“Finder”的信息 window “mdouma46 Info”,应用程序 Finder”的Finder window id 1141}

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

所以我在运行代码时遇到的错误是:

错误“无法将应用程序 \"Finder\" 的 window 1 的 «class fvtg» 转换为类型别名。” 编号 -1700 从 window 1 的 «class fvtg» 到别名

(换句话说,Inspector window,一个普通的window没有 FileViewer 目标( fvtg )属性;只有Finder window有)。

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

所以,像这样:

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;
}

我过去需要在一个项目中这样做,并重复到 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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM