macOS: фокус на полноэкранном окне или создание доступных объектов для полноэкранного окна - PullRequest
0 голосов
/ 25 октября 2019

Я работаю над приложением 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. Можно ли переключиться на полноэкранные окна через идентификатор процесса / идентификатор окна / и т. Д.?

...