无论如何,API CGSessionCopyCurrentDictionary
允许您获取有关屏幕睡眠和屏幕锁定的信息,以用于GUI会话.如果您没有GUI会话(例如,因为您正在使用ssh shell),或者您的会话不拥有控制台(例如,因为某人拥有快速用户切换您的身份),则您赢得了“不能得到这些信息,但你至少能够检测到这些情况.
这是我知道的所有操作系统的唯一机制,从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)'
现在,如果你已经进入Mac了,而且你现在也登录到这个Mac的GUI控制台(同样的用户)呢?在这种情况下,您的ssh登录会话可以与本地终端登录会话完全相同的方式与控制台登录会话进行通信.所以,CGSessionCopyCurrentDictionary将获得相同的值.
中介该连接的引导服务器将应用一些限制(例如,安全性授权-u foo应该从终端工作,但不能通过ssh),但是没有完全记录,并且从版本更改为版本,所以这可能不是你要依靠.而是要实际读取您的登录会话信息
如果要进一步了解,请从Multiple User Environments Programming Topics开始阅读.但有些信息在任何地方都没有真正记录(例如,SessionGetInfo引用的Mach级会话和utpx引用的BSD级会话如何绑定在一起) .许多相关的工具和库是open source,这可能有所帮助.即使阅读所有这些都不会告诉你如何做你想要的,它会告诉你你想要什么,以及正确的术语用于搜索和提出问题,这可能是足够好的.