2017-11-07 107 views
9

Window ID verilmişken, program aracılığıyla öntanımlı olarak MacOS'taki bir pencereye (uygulamasma ait olmayan) bir pencereye geçişi ve odaklamayı nasıl etkinleştiririm? Uygulamam kullanıcı tarafından Erişilebilirlik izinleri vb. Ile çalışır.Pencere Kimliği'ni kullanarak bir pencere etkinleştirin

Şaşırtıcı bir şekilde, Quartz Window Services page'da açıklanan işlevlerin hiçbiri bunu yapmadı.

Şu anda Swift kullanıyorum, ancak Objective-C, AppleScript veya başka bir şey kullanıyorum.

DÜZENLEME: Cepheye üst uygulamada tüm pencereleri getirmek istemiyoruz

- pencere kimliğiyle eşleşen sadece özgü.

Düzenleme:

Ben NSWindow türü sadece mevcut sürecin pencerelerine kastedilmektedir biliyorum, ama harici uygulamalara ait pencereleri temsil hiçbir sınıf var mı? Dışsal olanlar da dahil olmak üzere çalışan herhangi bir uygulamaya başvurmak için NSRunningApplication gibi, tüm açık pencereleri (doğru izinleri varsayarak) ele almak için bir API bekliyorum. Bir yerde gömülü NSOpenWindow veya CGWindow gibi bir sınıf var mı?

+0

göstermek gibi görünüyor daha olun belirli, 'Pencere Kimliği' nedir ve nasıl aldınız? – Hexfire

+1

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

+0

Pencere kimliği, "CGWindowListCopyWindowInfo()" –

cevap

1

henüz belli pencereye geçmek için bir yol bulamadık, ama bu fonksiyonu kullanarak belirli bir pencereyi içeren uygulamasına geçiş yapabilirsiniz:

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

Muhtemelen öyledir adıyla geçmek için kullanılan yaklaşımlar yanı:

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

Örnek: benim mac OpenOffice On switchToApp(named: "OpenOffice")

kCGWindowNumber = 599 bir pencere ile başlandı, bu nedenle bu sa sahiptir Beni etkisi: Bildiğim kadarıyla bugüne kadar öğrendim olarak switchToApp(withWindow: 599)

, seçenekleriniz app anda etkin pencereyi göstermek için olmak, ya da (aktivasyon seçeneği olarak .activateAllWindows kullanarak) tüm pencereleri