2017-11-07 30 views
9

W jaki sposób zostałabym aktywowana programowo, np. Przesunięcie do przodu i skupienie okna na systemie MacOS (nie należące do mojej aplikacji), biorąc pod uwagę jego numer Window ID. Moja aplikacja działałaby z użytkownikami, którym udzielono pozwolenia na dostęp, itp.Aktywacja okna z jego identyfikatorem okna

Zaskakująco, żadna z funkcji opisanych w Quartz Window Services page nie wydaje się tego robić.

Korzystam obecnie z Swift, ale jestem otwarty na używanie Objective-C, AppleScript lub cokolwiek innego.

EDIT:

Nie chcę doprowadzić do przodu wszystkie okna aplikacji dominującej - tylko konkretnego pasujący identyfikator okna.

Edit:

wiem, że typ NSWindow jest przeznaczona tylko odnieść się do okna bieżącego procesu, ale to nie ma klasy, która reprezentuje okien należących do zewnętrznych aplikacji? Tak jak mamy NSRunningApplication, aby odnieść się do każdej uruchomionej aplikacji, w tym zewnętrznej, oczekiwałem, że interfejs API obsłuży wszystkie otwarte okna (zakładając odpowiednie uprawnienia). Czy gdzieś jest pochowana jakaś klasa taka jak NSOpenWindow lub CGWindow?

+0

Proszę być bardziej konkretnie, czym jest "Window ID" i jak to zrobiłeś? – Hexfire

+1

https://developer.apple.com/documentation/coregraphics/kcgwindownumber –

+0

Identyfikator okna jest jedną z wymaganych wartości obecnych w oknie informacji zwróconych przez 'CGWindowListCopyWindowInfo()' –

Odpowiedz

1

nie znaleźć sposób, aby przełączyć się do określonego okna jeszcze, ale można przełączyć się na aplikację, która zawiera konkretne okno przy użyciu tej funkcji:

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) 
    } 
} 

Prawdopodobnie jest przydatna, aby przełączyć się z nazwy a także:

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) 
    } 
} 

Przykład: switchToApp(named: "OpenOffice")

na moim Mac OpenOffice został rozpoczęty z okna z kCGWindowNumber = 599, więc to nie ma AF mnie efekt: switchToApp(withWindow: 599)

O ile dowiedziałem się tak daleko, opcje wydają się pokazać aktualnie aktywnego okna aplikacji lub pokazać wszystkie okna (używając .activateAllWindows jako opcja aktywacja)

Powiązane problemy