测试屏幕保护程序是运行还是用户锁定

时间:2014-12-16 22:03:18

标签: objective-c macos cocoa core-graphics core-foundation

在mac os x上,我知道在cocoa中我可以设置一个观察者来检测未来的屏幕保护程序事件或者修改用户锁定事件,如下所示:

27 
28 - (id)init {
29   if ((self = [super init])) {
30     NSDistributedNotificationCenter* distCenter =
31           [NSDistributedNotificationCenter defaultCenter];
32     [distCenter addObserver:self
33                    selector:@selector(onScreenSaverStarted:)
34                        name:@"com.apple.screensaver.didstart"
35                      object:nil];
36     [distCenter addObserver:self
37                    selector:@selector(onScreenSaverStopped:)
38                        name:@"com.apple.screensaver.didstop"
39                      object:nil];
40     [distCenter addObserver:self
41                    selector:@selector(onScreenLocked:)
42                        name:@"com.apple.screenIsLocked"
43                      object:nil];
44     [distCenter addObserver:self
45                    selector:@selector(onScreenUnlocked:)
46                        name:@"com.apple.screenIsUnlocked"
47                      object:nil];
48   }
49   return self;
50 }
51 

但是在我添加这个观察者之前说,有没有办法测试屏幕保护程序是运行还是用户锁定?

由于

2 个答案:

答案 0 :(得分:1)

您可以使用-

通过检查ScreenSaverEngine进程是否正在运行来检查屏幕保护程序是否正在运行

pgrep ScreenSaverEngine

您可以使用-

进行尝试
while true
do
pgrep ScreenSaverEngine
sleep 1
done

然后打开屏幕保护程序。


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

很多简单的代码-

import Quartz
d = Quartz.CGSessionCopyCurrentDictionary()
print('CGSSessionScreenIsLocked' in d.keys())

答案 1 :(得分:0)

我找到了部分解决方案:OSX: check if the screen is locked

使用此方法的问题是它认为在屏幕保护程序出现的那一刻它被锁定,即使你有"需要密码延迟"设置为大于立即的东西。任何人都知道如何区分"只是屏幕保护程序在"和"屏幕保护开启和锁定(如现在鼠标移动将显示密码屏幕)" ?