mac screensaver start event

前端 未结 3 1155
感动是毒
感动是毒 2020-12-24 00:29

Is there an event fired when screensaver starts? Like for keychain locking:

OSStatus keychain_locked(SecKeychainEvent keychainEvent, SecKeychainCallbackInfo          


        
相关标签:
3条回答
  • 2020-12-24 01:06

    This isn't exactly an answer to the question, but I spent a lot of time looking in vain for a list of the notifications posted by macOS, so I wanted to post some code I wrote for notification discovery.

    The code simply signs up to listen to all notifications, and prints some info for each as it comes in.

    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()
    
    0 讨论(0)
  • 2020-12-24 01:10

    Finally found it — the solution is to use NSDistributedNotificationCenter and observe folowing events

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

    Like

    [[NSDistributedNotificationCenter defaultCenter]
       addObserver:self
       selector:@selector(screensaverStarted:)
       name:@"com.apple.screensaver.didstart"
       object:nil];
    
    0 讨论(0)
  • 2020-12-24 01:26

    While there is no Carbon event for this, you can get notified when the current application changes, and then check to see if the new application is the screen saver process.


    // 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 讨论(0)
提交回复
热议问题