evento inizio mac screensaver
-
07-07-2019 - |
Domanda
C'è un evento generato all'avvio del salvaschermo? Come per il blocco portachiavi:
OSStatus keychain_locked(SecKeychainEvent keychainEvent, SecKeychainCallbackInfo *info, void *context){...}
Soluzione
Finalmente l'ho trovato & # 8212; la soluzione è utilizzare NSDistributedNotificationCenter e osservare gli eventi folowing
- com.apple.screensaver.didstart
- com.apple.screensaver.willstop
- com.apple.screensaver.didstop
- com.apple.screenIsLocked
- com.apple.screenIsUnlocked
come
[[NSDistributedNotificationCenter defaultCenter]
addObserver:self
selector:@selector(screensaverStarted:)
name:@"com.apple.screensaver.didstart"
object:nil];
Altri suggerimenti
Sebbene non vi siano eventi Carbon per questo, puoi ricevere una notifica quando l'applicazione corrente cambia, e quindi verificare se la nuova applicazione è il processo di screen saver.
// 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;
}
Questa non è esattamente una risposta alla domanda, ma ho trascorso molto tempo a cercare invano un elenco delle notifiche pubblicate da OS X, quindi volevo pubblicare del codice che ho scritto per il rilevamento delle notifiche.
Il codice si iscrive semplicemente per ascoltare tutte le notifiche e stampa alcune informazioni per ognuna appena arrivano.
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()