使用其窗口ID激活窗口

Him*_*u P 15 macos cocoa quartz-graphics swift

我将如何以编程方式激活,即在macOS(不属于我的应用程序)上移动到前端并聚焦窗口Window ID.我的应用程序将以用户授予的辅助功能权限等运行

令人惊讶的是,Quartz Window Services页面上描述的所有功能似乎都没有.

我目前正在使用Swift,但我愿意使用Objective-C,AppleScript或其他任何东西.

编辑:

我不想把父应用程序的所有窗口都带到前面 - 只有与窗口ID匹配的特定窗口.

编辑:

我知道该NSWindow类型仅用于引用当前进程的窗口,但是没有代表外部应用程序拥有的窗口的类吗?就像我们必须NSRunningApplication引用任何正在运行的应用程序,包括外部应用程序,我期待一个API来处理所有打开的窗口(假设正确的权限).在某个地方有类似NSOpenWindowCGWindow埋葬的课吗?

Dan*_*iel 5

我还没有找到切换到特定窗口的方法,但是您可以使用此功能切换到包含特定窗口的应用程序:

func switchToApp(withWindow windowNumber: Int32) {
    let options = CGWindowListOption(arrayLiteral: CGWindowListOption.excludeDesktopElements, CGWindowListOption.optionOnScreenOnly)
    let windowListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0))
    guard let infoList = windowListInfo as NSArray? as? [[String: AnyObject]] else { return }
    if let window = infoList.first(where: { ($0["kCGWindowNumber"] as? Int32) == windowNumber}), let pid = window["kCGWindowOwnerPID"] as? Int32 {
        let app = NSRunningApplication(processIdentifier: pid)
        app?.activate(options: .activateIgnoringOtherApps)
    }
}
Run Code Online (Sandbox Code Playgroud)

按名称切换也可能很有用:

func switchToApp(named windowOwnerName: String) {
    let options = CGWindowListOption(arrayLiteral: CGWindowListOption.excludeDesktopElements, CGWindowListOption.optionOnScreenOnly)
    let windowListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0))
    guard let infoList = windowListInfo as NSArray? as? [[String: AnyObject]] else { return }

    if let window = infoList.first(where: { ($0["kCGWindowOwnerName"] as? String) == windowOwnerName}), let pid = window["kCGWindowOwnerPID"] as? Int32 {
        let app = NSRunningApplication(processIdentifier: pid)
        app?.activate(options: .activateIgnoringOtherApps)
    }
}
Run Code Online (Sandbox Code Playgroud)

例子: switchToApp(named: "OpenOffice")

在我的 Mac 上,OpenOffice 以一个带有 的窗口启动kCGWindowNumber = 599,因此具有相同的效果:switchToApp(withWindow: 599)

据我目前发现,您的选择似乎是显示应用程序的当前活动窗口,或显示所有窗口(.activateAllWindows用作激活选项)

  • 有没有办法激活应用程序的特定窗口?示例:Firefox 处于活动状态并且有 5 个窗口。我想特别激活一个,这要归功于它的“kCGWindowNumber”。 (2认同)