如何判断最前面的 window 是 MacOS 中使用 Applescript 的 NSOpenPanel / 文件打开对话框?

How do I tell if the frontmost window is a NSOpenPanel / file open dialog in MacOS using Applescript?

我正在尝试使用 AppleScript 自动更改最前面的“文件打开对话框”或 NSOpenPanel 对话框的目录,无论 window 是任何应用程序的一部分。这个想法是我按下一个热键,它会控制那个对话框切换到一个特定的文件夹。

我似乎无法找到如何找到 window 的属性,以便为“文件打开对话框”过滤它。使用辅助功能检查器我可以发现“class”是 NSOpenPanel。如何使用 Applescript 获取 window 的 class?

如果你运行下面的AppleScript,你可以看到最前面window的属性:

tell application "anApp" to activate
delay 1
tell application "System Events"
    tell process "anApp"
        properties of window 1
    end tell
end tell

应用程序必须处于活动状态才能查看 windows 的属性;如果应用程序在后台运行,您将无法获得一致的结果。

应该可以通过测试以下属性的某些组合来识别 NOOpenPanel:

  • 角色描述:“对话”
  • 标题:“打开”
  • 子角色:“AXDialog”
  • 名称:“打开”
  • 描述:“对话框”

就个人而言,我可能会依赖 namerole description,只要应用程序通过标准 'Open' 对话框,它们应该是相同的。 'Save' 对话框将是相同的,除了 titlename 将是 'save' 而不是 'open'。

如果您的应用程序显示的是打开或保存 sheet(附加到标题栏的子 window),而不是单独的对话框,那么您需要稍微改变一下。获取属性的 AppleScript 如下所示:

tell application "anApp" to activate
delay 1
tell application "System Events"
    tell process "anApp"
        tell window 1
            properties of sheet 1
        end tell
    end tell
end tell

相关可测试属性如下:

  • 辅助功能说明:“保存”
  • 角色描述:"sheet"
  • 角色:“AXSheet”
  • 描述:“保存”

您可能需要添加逻辑来测试前面的 window 是否有 sheet,这应该区分对话框和 sheets。

一些应用程序使用 non-standard open/save 对话框,您必须在 case-by-case 的基础上考虑它们。没有灵丹妙药。