如何为多个文件/目录打开单个Finder「显示简介」窗口?
如何通过代码为多个本地URL打开Finder单个「检查器」窗口(对应Cmd+Option+I效果)
我当前的代码会为每个URL打开单独的「显示简介」窗口,效果等同于按下Cmd+I:
func openGetInfoWnd(for urls: [URL]) { let pBoard = NSPasteboard(name: NSPasteboard.Name(rawValue: "pasteBoard_\(UUID().uuidString )") ) pBoard.writeObjects(urls as [NSPasteboardWriting]) NSPerformService("Finder/Show Info", pBoard) }
我需要实现的是像按下Cmd+Option+I那样,为选中的多个本地URL打开单个「多项目信息」检查器窗口。尝试使用NSPerformService("Finder/Show Inspector", pBoard)但没有效果。
解决方案:使用AppleScript控制Finder
直接通过NSPerformService无法实现该效果,改用AppleScript模拟手动操作是更可靠的方式,以下是Swift代码实现:
func openMultiItemInspector(for urls: [URL]) { // 将URL转换为Finder可识别的POSIX路径格式 let paths = urls.map { $0.path }.map { "\"\($0)\"" }.joined(separator: ", ") // 构建AppleScript脚本 let script = """ tell application "Finder" set selectedItems to { \(paths) } as alias list set selection to selectedItems activate tell application "System Events" to keystroke "i" using {command down, option down} end tell """ // 执行脚本 var error: NSDictionary? if let scriptObject = NSAppleScript(source: script) { scriptObject.executeAndReturnError(&error) if let error = error { print("执行错误: \(error)") } } }
代码说明
- 先把URL转为AppleScript能识别的别名路径格式,让Finder选中目标文件
- 模拟按下Cmd+Option+I快捷键,完全还原手动操作的效果,确保打开单个检查器窗口
无快捷键模拟的替代方案:使用Accessibility API
如果不想依赖快捷键,可以通过系统辅助功能API直接控制Finder:
import ApplicationServices func openMultiItemInspectorAX(for urls: [URL]) { // 获取Finder进程ID guard let finderPID = NSWorkspace.shared.runningApplications.first(where: { $0.bundleIdentifier == "com.apple.finder" })?.processIdentifier else { print("Finder未运行") return } let finderElement = AXUIElementCreateApplication(finderPID) // 设置Finder选中的文件列表 let paths = urls.map { $0.path as CFString } var selectedFiles: CFArray = paths as CFArray AXUIElementSetAttributeValue(finderElement, kAXSelectedChildrenAttribute as CFString, &selectedFiles) // 触发打开检查器的动作 AXUIElementPerformAction(finderElement, kAXShowInspectorAction as CFString) }
注意:使用该方案需要在项目
Info.plist中添加NSAppleEventsUsageDescription和NSAccessibilityUsageDescription权限描述,并且用户需要在系统偏好设置的「安全性与隐私」→「隐私」→「辅助功能」中授予应用权限。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

