有没有什么办法来检查,如果屏幕被锁定在外壳或AppleScript的? 不只是检查,如果屏幕保护程序运行,但屏幕由节能设置或按^⇧⏏( 移动 + 控制 + 弹出 )锁定。
先感谢您。
有没有什么办法来检查,如果屏幕被锁定在外壳或AppleScript的? 不只是检查,如果屏幕保护程序运行,但屏幕由节能设置或按^⇧⏏( 移动 + 控制 + 弹出 )锁定。
先感谢您。
首先,有一个在你的问题有点混乱。 两个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
下面是如何解释的回应:
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
捆绑在一起)。 许多相关的工具和库是开源的 ,这可能会有帮助。 即使在所有的,阅读起来不会告诉你怎么做你想要什么,它会告诉你,你想要什么,而右侧方面使用搜索和提问,这可能是不够好。