Objective c 测试屏幕保护程序是否正在运行或工作区是否已锁定

Objective c 测试屏幕保护程序是否正在运行或工作区是否已锁定,objective-c,macos,cocoa,core-graphics,core-foundation,Objective C,Macos,Cocoa,Core Graphics,Core Foundation,在Mac OS X上,我知道在Cocoa中我可以设置一个观察者来检测未来的屏幕保护程序事件或工作区锁定事件,如下所示: - (id)init { if ((self = [super init])) { NSDistributedNotificationCenter* distCenter = [NSDistributedNotificationCenter defaultCenter]; [distCenter addObserver:sel

在Mac OS X上,我知道在Cocoa中我可以设置一个观察者来检测未来的屏幕保护程序事件或工作区锁定事件,如下所示:

- (id)init {
   if ((self = [super init])) {
      NSDistributedNotificationCenter* distCenter =
           [NSDistributedNotificationCenter defaultCenter];
      [distCenter addObserver:self
                    selector:@selector(onScreenSaverStarted:)
                        name:@"com.apple.screensaver.didstart"
                      object:nil];
      [distCenter addObserver:self
                    selector:@selector(onScreenSaverStopped:)
                        name:@"com.apple.screensaver.didstop"
                      object:nil];
      [distCenter addObserver:self
                    selector:@selector(onScreenLocked:)
                        name:@"com.apple.screenIsLocked"
                      object:nil];
      [distCenter addObserver:self
                    selector:@selector(onScreenUnlocked:)
                        name:@"com.apple.screenIsUnlocked"
                      object:nil];
   }
   return self;
}

但在我添加这些观察者之前,有没有办法测试屏幕保护程序是否正在运行,或者工作区是否被锁定?

我找到了一个部分解决方案:


但这种方法的问题是,它认为它在屏幕保护程序启动时就被锁定了,即使您将“requirepassworddelay”设置为比立即设置更大的值。有人知道如何区分“仅屏幕保护程序打开”和“屏幕保护程序打开并锁定(如现在鼠标移动将显示密码屏幕)”?

您可以通过使用检查
ScreenSaverEngine
进程是否正在运行来检查屏幕保护程序是否正在运行-

pgrep屏幕保护引擎

您可以使用以下方法进行尝试:

为true时
做
pgrep屏幕保护引擎
睡眠1
完成
然后打开屏幕保护程序


用于检查锁屏-
安装
quartz
-
pip安装pyobjc framework Quartz

非常简单的代码-

导入石英
d=Quartz.CGSessionCopyCurrentDictionary()
打印('CGSSessionScreenIsLocked'在d.keys()中)

很有趣,谢谢!但若用户并没有运行屏幕保护程序,而是锁定了计算机,那个该怎么办?@noitidart虽然我已经更新了我的答案,但这部分已经在这里得到了回答-谢谢@markrosor!我原希望采用非石英法,但我接受了你的解决方案。