Мне было интересно, понял ли кто-нибудь, как активировать и показать окно 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()
}
}
}
}