2009-09-14 11 views
12

Czy zdarzenie wystartowało przy uruchomieniu wygaszacza ekranu? Podobnie jak w przypadku blokowania pęku kluczy:uruchomienie wygaszacza ekranu mac

OSStatus keychain_locked(SecKeychainEvent keychainEvent, SecKeychainCallbackInfo *info, void *context){...} 

Odpowiedz

28

Wreszcie znalazł - rozwiązaniem jest użycie NSDistributedNotificationCenter i obserwować folowing wydarzenia

  • com.apple.screensaver.didstart
  • com.apple.screensaver.willstop
  • com.apple.screensaver.didstop
  • com.apple.screenIsLocked
  • com.apple.screenIsUnlocked

Jak

[[NSDistributedNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(screensaverStarted:) 
    name:@"com.apple.screensaver.didstart" 
    object:nil]; 
2

Choć nie ma na to wydarzenie węgla, ty może otrzymywać powiadomienia, gdy obecne zmiany aplikacji, a następnie sprawdzić, czy nowa aplikacja jest procesem wygaszacz ekranu.


// Register the event handler for when applications change 
{ 
    EventTypeSpec es; 
    es.eventClass = kEventClassApplication; 
    es.eventKind = kEventAppFrontSwitched; 
    InstallApplicationEventHandler(&appChanged, 1, &es, NULL, NULL); 
} 

OSStatus appChanged(EventHandlerCallRef nextHandler, EventRef anEvent, void* userData) 
{ 
    ProcessSerialNumber psn;  
    GetEventParameter(anEvent, kEventParamProcessID, typeProcessSerialNumber, 
         NULL, sizeof(psn), NULL, &psn); 

    // Determine process name 
    char procName[255]; 
    { 
     ProcessInfoRec pInfo; 
     Str255 procName255; 
     FSRef ref; 

     pInfo.processInfoLength = sizeof(ProcessInfoRec); 
     pInfo.processName = procName255; 
     pInfo.processAppRef = &ref; 
     GetProcessInformation(&psn, &pInfo); 

     const unsigned int size = (unsigned int)procName255[0]; 
     memcpy(procName, procName255 + 1, size); 
     procName[size] = '\0'; 
    } 

    if(strcmp(procName, "ScreenSaverEngine") == 0) 
    { 
     NSLog(@"Found %s\n", procName); 
    } 

    return noErr; 
} 
0

To nie jest dokładnie to odpowiedź na pytanie, ale spędziłem dużo czasu patrząc na próżno na liście zgłoszeń opublikowanych przez OS X, więc chciałem opublikować napisany przeze mnie kod do wykrywania powiadomień.

Kod prostu podpisuje się słuchać wszystkich powiadomień i drukuje kilka informacji dla każdego, jak to jest w.

import Foundation 

let distCenter = CFNotificationCenterGetDistributedCenter() 
if distCenter == nil { 
    exit(1) 
} 

CFNotificationCenterAddObserver(distCenter, nil, { (center, observer, name, object, userInfo) -> Void in 
     print("Event occurred: \(name) User info: \(userInfo)") 
    }, nil, nil, .DeliverImmediately) 

CFRunLoopRun()