macos - 操作系统: check if the screen is locked

标签 macos shell applescript

有什么办法可以检查屏幕是否在 shell 或 applescript 中锁定? 不仅检查屏幕保护程序是否正在运行,还可以通过节能设置或按 ⌃⇧⏏ (shift+control+弹出)。

提前谢谢您。

最佳答案

首先,你的问题有点困惑。 Shift+Control+Eject 和节能器都会使屏幕进入休眠状态,这与锁定屏幕不同。根据您的其他设置,这可能还需要锁定屏幕,但这是一个单独的问题。 IIRC,在 Lion 上,默认情况下,两者都不会锁定屏幕,但如果您让屏幕处于休眠状态的时间超过“安全与隐私”中设置的时间,则会锁定屏幕。

无论如何,API CGSessionCopyCurrentDictionary允许您获取有关 GUI session 的屏幕 sleep 和屏幕锁定的信息。如果您没有 GUI session (例如,因为您在 ssh shell 中运行),或者您的 session 不拥有控制台(例如,因为有人快速用户将您切换出去),您将不会你无法获得这些信息,但你至少能够检测到这些情况。

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

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

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

以下是如何解释响应:

  • 如果您没有得到任何返回,则表明您没有 UI session 。
  • 如果字典的 kCGSSessionOnConsoleKey = 0 或不存在,则说明您的 GUI session 不拥有控制台,或者控制台的屏幕处于 sleep 状态。
  • 如果字典的 CGSSessionScreenIsLocked = 1,则屏幕被锁定。

一种问题情况是,kCGSSessionOnConsoleKey 为 0(或缺失),而 CGSSessionScreenIsLocked 为 1。在这种情况下,您要么已将屏幕置于 sleep 状态并锁定他们或其他人拿走了控制台并锁定了屏幕(无论是否让他们进入休眠状态)。我不确定是否有办法区分这些情况。但是,如果您正在寻找“不要尝试显示对话框,因为用户必须首先解锁屏幕”,这两种情况都意味着“不显示对话框”。

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

#!/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 登录 session 可以与控制台登录 session 进行通信,其方式与本地终端登录 session 完全相同。因此,CGSessionCopyCurrentDictionary 将获得相同的值。

调解该连接的引导服务器将应用一些限制(例如,securityauthorize -u foo 应该从终端工作,但不能通过 ssh 工作),但这些没有完整记录,并且会发生变化从一个版本到另一个版本,所以这可能不是您想要依赖的东西。相反,您想要实际读取您的登录 session 信息

如果您想进一步了解此内容,请从阅读 Multiple User Environments Programming Topics 开始。但有些信息并没有真正在任何地方记录(例如,SessionGetInfo 引用的 Mach 级 session 和 utmpx 引用的 BSD 级 session 如何绑定(bind)在一起) 。许多相关的工具和库是 open source ,这可能有帮助。即使阅读所有内容并不能告诉您如何做您想做的事情,它也会准确地告诉您您想要什么,以及用于搜索和提出问题的正确术语,这可能就足够了。

关于macos - 操作系统: check if the screen is locked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505255/

相关文章:

objective-c - 意外的应用程序支持路径

Xcode - 如何以 root 身份分析应用程序?

macos - 找不到 .zshrc 文件

applescript - 使用 AppleScript 将邮件消息设置为纯文本

swift 5.0 : How to fix nw_path_close_fd Failed to close guarded necp fd 4 [9: Bad file descriptor] error

linux - 提取音频,再次操作和合并

linux - 有人可以建议一个快速的 oneliner 在 unix 中将 20111214 转换为 2011.12.14 吗?

c++ - 如何编写命令行 shell 来捕获 'UP' 键以获取历史输入?

macos - 允许使用 Applescript 的防火墙连接

cocoa - 使用 cocoa 刷新 Finder 中文件或文件夹的图标