Him*_*u P 15 macos cocoa quartz-graphics swift
我将如何以编程方式激活,即在macOS(不属于我的应用程序)上移动到前端并聚焦窗口Window ID.我的应用程序将以用户授予的辅助功能权限等运行
令人惊讶的是,Quartz Window Services页面上描述的所有功能似乎都没有.
我目前正在使用Swift,但我愿意使用Objective-C,AppleScript或其他任何东西.
编辑:
我不想把父应用程序的所有窗口都带到前面 - 只有与窗口ID匹配的特定窗口.
编辑:
我知道该NSWindow类型仅用于引用当前进程的窗口,但是没有代表外部应用程序拥有的窗口的类吗?就像我们必须NSRunningApplication引用任何正在运行的应用程序,包括外部应用程序,我期待一个API来处理所有打开的窗口(假设正确的权限).在某个地方有类似NSOpenWindow或CGWindow埋葬的课吗?
我还没有找到切换到特定窗口的方法,但是您可以使用此功能切换到包含特定窗口的应用程序:
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用作激活选项)
| 归档时间: |
|
| 查看次数: |
1184 次 |
| 最近记录: |