2013-08-04 16 views
8

Pracuję nad aplikacją OS X, która wyświetla niestandardowe okna na wszystkich dostępnych obszarach wszystkich podłączonych wyświetlaczy. Mogę uzyskać tablicę dostępnych obiektów ekranowych, wywołując [ekrany NSScreen].Powiadomienie, gdy wyświetlacz zostanie podłączony lub odłączony

To, czego obecnie brakuje, to sposób informowania użytkownika, czy łączy ekran z systemem lub odłącza go od niego.

Przeszukałem dokumentację kakao w poszukiwaniu powiadomień, które dotyczą scenariusza podobnego do tego bez powodzenia, i nie chcę wierzyć, że nie ma żadnego powiadomienia systemowego, które zostanie wysłane podczas zmiany liczby wyświetlaczy połączonych z system.

Wszelkie sugestie, jak rozwiązać ten problem?

+0

Może 'NSApplicationDidChangeScreenParametersNotification'? –

Odpowiedz

8

Istnieje kilka sposobów, aby to osiągnąć:
Można wdrożyć applicationDidChangeScreenParameters: w delegata aplikacji (metoda jest częścią NSApplicationDelegateProtocol).
Innym sposobem jest wysłuchanie numeru NSApplicationDidChangeScreenParametersNotification wysłanego przez domyślne centrum powiadomień [NSNotificationCenter defaultCenter].

Za każdym razem, gdy wywoływana jest metoda delegata lub otrzymujesz powiadomienie, możesz wykonać iterację ponad [NSScreen screens] i sprawdzić, czy wyświetlacz został podłączony lub usunięty (musisz zachować listę wyświetlania, którą możesz sprawdzić przy uruchomieniu programu).

Podejście non-Cocoa byłoby poprzez rdzeń graficzny usług Wyświetlacz:
Trzeba zaimplementować funkcję rekonfiguracji i zarejestrować go z CGDisplayRegisterReconfigurationCallback(CGDisplayReconfigurationCallBack cb, void* obj);

W funkcji rekonfiguracji można wyszukać stan wyświetlacza zagrożonym. Np .:

void DisplayReconfigurationCallBack(CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void* userInfo) 
{ 
    if(display == someDisplayYouAreInterestedIn) 
    { 
     if(flags & kCGDisplaySetModeFlag) 
     { 
      ... 
     } 
     if(flags & kCGDisplayRemoveFlag) 
     { 
      ... 
     } 
     if(flags & kCGDisplayDisabledFlag) 
     { 
      ... 
     } 
    } 
    if(flags & kCGDisplaySetModeFlag || flags & kCGDisplayDisabledFlag || flags & kCGDisplayRemoveFlag) 
    { 
     ... 
    } 
} 
+0

Dziękuję za komentarz. Jaka byłaby korzyść z używania usług Core Graphics Display w stosunku do powiadomień Cocoa i moich metod kakao? Wydaje mi się, że dodaje on dodatkową warstwę złożoności bez żadnych oczywistych korzyści. – Gabor

+0

Jedyną korzyścią jest to, że wywołanie zwrotne rekonfiguracji zawiera już pewne informacje o stanie (dostarczane jako CGDisplayChangeSummaryFlags), więc nie musisz porównywać wszystkich szczegółów NSScreen podczas zmiany konfiguracji. Powiadomienie o kakao lub metoda delegata również są w porządku. –

3

w Swift 3.0:

let nc = NotificationCenter.default 
    nc.addObserver(self, 
        selector: #selector(screenDidChange), 
        name: NSNotification.Name.NSApplicationDidChangeScreenParameters, 
        object: nil) 

NC oddzwaniania:

final func screenDidChange(notification: NSNotification){ 
    let userInfo = notification.userInfo 
    print(userInfo) 
} 
Powiązane problemy