OSX:检查屏幕被锁定(OSX: check if the screen is locked)

2019-06-26 07:33发布

有没有什么办法来检查,如果屏幕被锁定在外壳或AppleScript的? 不只是检查,如果屏幕保护程序运行,但屏幕由节能设置或按^⇧⏏( 移动 + 控制 + 弹出 )锁定。

先感谢您。

Answer 1:

首先,有一个在你的问题有点混乱。 两个Shift +控制+弹出和节能放在屏幕睡觉,这是不一样的东西将它们锁定。 根据您的其他设置,这可能还需要锁定屏幕,但是这是一个单独的问题。 IIRC,在Lion上,默认情况下,没有人会锁定屏幕,但如果你离开屏幕睡了较安全和隐私设定的时间,将其锁定。

总之,API CGSessionCopyCurrentDictionary让您可以获得两个屏幕的睡眠和屏幕锁定信息,为您的GUI会话。 如果你没有一个GUI会话(例如,因为你在一个SSH shell中运行),或会话没有自己的控制台(例如,因为有人使用快速用户切换你),你赢了” T为能够得到这个信息,但是你至少能够检测到这些情况。

这是我所知道的,唯一的机制适用于所有操作系统的10.5(实际上10.3)至10.8(但是,这并不意味着它是唯一一个实际上存在...)。

有没有直接的方法从bash或AppleScript的调用它。 但是,您可以使用自己喜欢的桥(PyObjC,MacRuby的,ASOC等)来间接调用它。 下面是使用Python的例子:

#!/usr/bin/python
import Quartz
d = Quartz.CGSessionCopyCurrentDictionary()
print d

下面是如何解释的回应:

  • 如果你得不到任何回报,那么你没有一个UI会话。
  • 如果字典有kCGSSessionOnConsoleKey = 0,或者不存在,或者您的GUI会话没有自己的控制台或控制台的屏幕是睡着了。
  • 如果字典有CGSSessionScreenIsLocked = 1,屏幕被锁定。

有一个问题的情况是kCGSSessionOnConsoleKey为0(或失踪)和CGSSessionScreenIsLocked为1。在这种情况下,要么你已经把睡觉的屏幕和锁定它们,或者其他人采取的控制台和锁定屏幕(带或不带把他们睡觉)。 我不知道是否有这些情况来区分的方式。 但是,如果你要寻找的“不要试图显示一个对话框,因为用户必须先解锁屏幕”,无论这些案件中的意思是“不显示一个对话框”。

所以,这应该给你你想要的东西:

#!/usr/bin/python
import sys
import Quartz
d=Quartz.CGSessionCopyCurrentDictionary()
sys.exit(d and 
         d.get("CGSSessionScreenIsLocked", 0) == 0 and 
         d.get("kCGSSessionOnConsoleKey", 0) == 1)

或者,把它变成一个班轮你可以直接在shell脚本放:

python -c 'import sys,Quartz; d=Quartz.CGSessionCopyCurrentDictionary(); sys.exit(d and d.get("CGSSessionScreenIsLocked", 0) == 0 and d.get("kCGSSessionOnConsoleKey", 0) == 1)'

现在,如果你以SSH方式登录到什么一台Mac,你正在当前登录到该Mac的GUI控制台(相同的用户)? 在这种情况下,你的ssh登录会话可以以完全相同的方式,一个本地终端登录会话将与控制台登录会话交流。 所以,CGSessionCopyCurrentDictionary是会得到相同的价值观。

介导这一方面会应用一些限制引导服务器(例如, security authorize -u foo应该从终端工作,而不是通过ssh),但这些都是不完全记录,并因版本变化,所以这可能不是要依靠。 相反,要真正地读你的登录会话信息

如果你想用这个走得更远,开始阅读多用户环境编程主题 。 但有些信息是不是真的记录的任何地方(例如,如何通过引用马赫级别会议SessionGetInfo通过引用和BSD级别会议utmpx捆绑在一起)。 许多相关的工具和库是开源的 ,这可能会有帮助。 即使在所有的,阅读起来不会告诉你怎么做你想要什么,它会告诉你,你想要什么,而右侧方面使用搜索和提问,这可能是不够好。



文章来源: OSX: check if the screen is locked