Domanda

C'è un evento generato all'avvio del salvaschermo? Come per il blocco portachiavi:

OSStatus keychain_locked(SecKeychainEvent keychainEvent, SecKeychainCallbackInfo *info, void *context){...}
È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top