2009-09-14 1 views
12

Есть ли событие, запущенное при запуске заставки? Как для брелка замок:mac screensaver начало события

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

ответ

28

Наконец нашел - решение использовать NSDistributedNotificationCenter и наблюдать folowing события

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

Как

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

Пока нет событий Carbon для этого, вы можете получить уведомление, когда текущие изменения приложения, а затем проверить, если новое приложение является процесс заставки.


// 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

Это не совсем ответ на этот вопрос, но я потратил много времени на поиски напрасно список уведомлений, отправленных OS X, поэтому я хотел опубликовать код, который я написал для обнаружения уведомлений.

код просто подпишется слушать всех уведомлений, и выводит некоторую информацию для каждого, как это происходит в.

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