Есть ли событие, запущенное при запуске скринсейвера? Как для блокировки брелка:
OSStatus keychain_locked(SecKeychainEvent keychainEvent, SecKeychainCallbackInfo *info, void *context){...}
Есть ли событие, запущенное при запуске скринсейвера? Как для блокировки брелка:
OSStatus keychain_locked(SecKeychainEvent keychainEvent, SecKeychainCallbackInfo *info, void *context){...}
Наконец, он нашел это решение - использовать NSDistributedNotificationCenter и наблюдать за событиями
Как
[[NSDistributedNotificationCenter defaultCenter]
addObserver:self
selector:@selector(screensaverStarted:)
name:@"com.apple.screensaver.didstart"
object:nil];
Пока для этого нет события 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;
}
Это не совсем ответ на вопрос, но я потратил много времени на поиски списка уведомлений, отправленных 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()