Активное и скрытое окно macOS, использующее kCGWindowNumber вместо kCGWindowOwnerPID - PullRequest
0 голосов
/ 28 сентября 2019

Мне было интересно, понял ли кто-нибудь, как активировать и показать окно macOS, используя его kCGWindowNumber.Я нашел способ сделать это, используя kCGWindowOwnerPID, но, поскольку мои приложения работают в X11 (XQuartz), все их kCGWindowOwnerPID - XQuartz.Поэтому мне нужно активировать конкретное окно, а не конкретный PID.


Я продолжил играть с кодом и стековым потоком.Я попытался поиграть с API доступа и подключился к xQuartz с помощью этого кода:

let xquartzPID:Int32 = 11939
var element = AXUIElementCreateApplication(xquartzPID)
var newarray:CFArray?
AXUIElementCopyAttributeValues(element, kAXWindowsAttribute as CFString, 0, 99999, &newarray);

Но здесь нет ни одного окна xQuartz.Если я выбираю PID из сафари, например, я вижу их.Я могу вывести все окна на передний план, используя:

AXUIElementSetAttributeValue(element, kAXFrontmostAttribute as CFString, kCFBooleanTrue)

Но не конкретное окно.Теперь я вернулся туда, где был с kCGWindowOwnerPID.Каждое окно каждого приложения xQuartz имеет один и тот же kCGWindowOwnerPID.Поэтому следующий код не помогает:

func switchToApp(named windowOwnerName: String) {
    CGWindowListOption.excludeDesktopElements, CGWindowListOption.optionOnScreenOnly)
    let windowListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0))
    guard let infoList = windowListInfo as NSArray? as? [[String: AnyObject]] else { return }
    for entry in infoList {
        if let windowName = entry["kCGWindowName"] as? String {
            if windowName == windowOwnerName {
                let pid = entry["kCGWindowOwnerPID"] as? Int32
                let app = NSRunningApplication(processIdentifier: pid!)
                app?.activate(options: .activateIgnoringOtherApps)
                app?.unhide()
            }
        }
    }
}
...