代码之家  ›  专栏  ›  技术社区  ›  tig Charlie Martin

mac屏幕保护程序启动事件

  •  13
  • tig Charlie Martin  · 技术社区  · 16 年前

    屏幕保护程序启动时是否触发事件?与钥匙链锁定类似:

    OSStatus keychain_locked(SecKeychainEvent keychainEvent, SecKeychainCallbackInfo *info, void *context){...}
    
    3 回复  |  直到 16 年前
        1
  •  34
  •   tig Charlie Martin    16 年前

    最终发现解决方案是使用NSDistributedNotificationCenter并观察以下事件

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

    喜欢

    [[NSDistributedNotificationCenter defaultCenter]
       addObserver:self
       selector:@selector(screensaverStarted:)
       name:@"com.apple.screensaver.didstart"
       object:nil];
    
        2
  •  2
  •   nall    16 年前

    虽然没有碳活动,但你 可以 在当前应用程序更改时收到通知,然后检查新应用程序是否为屏幕保护程序进程。


    // 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;
    }
    
        3
  •  2
  •   shawkinaw    6 年前

    这并不是问题的答案,但我花了很多时间徒劳地寻找macOS发布的通知列表,所以我想发布一些我为通知发现编写的代码。

    代码只是注册来收听 通知,并在收到每个通知时打印一些信息。

    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()
    
    推荐文章