Я работаю над приложением Mac, где мне нужно получить список всех открытых окон и перемещаться между ними.
В настоящее время я могу с помощью var windows = CGWindowListCopyWindowInfo([.optionAll], kCGNullWindowID) as! [NSDictionary]
получить список всех окон, затем я filter
на нем удалю ненужные.
Следующими шагами является создание доступных объектов:
let accessabilApp = AXUIElementCreateApplication(cgOwnerPid)
if let windows = AXUIElementCopyAttributeValue(accessabilApp, kAXMainWindowAttribute, [AXUIElement].self) {
return windows.filter {
let windowBounds = AXValueGetValue($0, kAXSizeAttribute, NSSize(), AXValueType.cgSize)!
let isReasonablyBig = windowBounds.width > minimumWindowSize && windowBounds.height > minimumWindowSize
return isReasonablyBig
}
}
Пока я вижу в начальном списке полноэкранные окна - они не создаются как доступные объекты.
1. Как я могу преодолеть этот лимит?
В случае, если это возможно позже, я могу сосредоточиться на нужном окне:
if let app = NSRunningApplication(processIdentifier: ownerPid!) {
app.activate(options: [.activateIgnoringOtherApps])
if let targetV = target {
AXUIElementPerformAction(targetV, kAXRaiseAction as CFString)
} else {
В качестве альтернативы, у меня все еще есть список всехокна с идентификатором процесса / идентификатором окна / и т.д. И я могу сосредоточиться на них:
func switchToApp(withWindow windowNumber: CGWindowID?) {
if let windowNumberValue = windowNumber {
let windowNumberValueStr = Int32(windowNumberValue)
let options = CGWindowListOption(arrayLiteral: .optionAll)
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) == windowNumberValueStr}), let pid = window["kCGWindowOwnerPID"] as? Int32 {
let app = NSRunningApplication(processIdentifier: pid)
app?.activate(options: .activateAllWindows)
}
}
}
, однако, это не работает для окон полноэкранного режима.
2. Можно ли переключиться на полноэкранные окна через идентификатор процесса / идентификатор окна / и т. Д.?