首页 > 解决方案 > 获取应用程序最前面窗口的更好方法 - Swift

问题描述

按名称获取指定应用程序并不难

NSWorkspace.shared.runningApplications.filter{$0.localizedName == "Safari"}.first

但是如何获取这个应用程序的第一个窗口,并用这个窗口进行小型化呢?

与此类似的东西

let app = NSWorkspace.shared.runningApplications.filter{$0.localizedName == "Safari"}.first
app.frontmostWindow.miniaturize()

标签: swift

解决方案


您可以使用 ScriptingBridge 执行此操作

import ScriptingBridge

let safari = SBApplication(bundleIdentifier: "com.apple.Safari")

let windowClass = appleEvent(keyword: "cwin")
let miniaturized = appleEvent(keyword: "pmnd")

let windows = safari?.elementArray(withCode: windowClass)
let frontMostWindow = (windows?.firstObject as? SBObject)?.get() as? SBObject
frontMostWindow?.property(withCode: miniaturized).setTo(true)

func appleEvent(keyword: StaticString) -> AEKeyword {
    keyword
        .utf8Start
        .withMemoryRebound(to: DescType.self, capacity: 1, \.pointee)
        .bigEndian
}

为了能够运行此代码,您需要一个com.apple.security.automation.apple-events授权设置为 true 的代码签名应用程序(允许将 AppleEvents 发布到其他应用程序)


推荐阅读