Начальное событие заставки Mac - PullRequest
13 голосов
/ 14 сентября 2009

При запуске заставки происходит событие? Как для блокировки цепочки для ключей:

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

Ответы [ 3 ]

31 голосов
/ 13 октября 2009

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

  • 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 голосов
/ 27 сентября 2009

Пока для этого нет события 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;
}
1 голос
/ 22 января 2016

Это не совсем ответ на вопрос, но я потратил много времени на тщательный поиск списка уведомлений, опубликованных 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()
...