2012-07-16 152 views
14

是否有任何方法檢查屏幕是否被鎖定在shell或applescript中? 不只是檢查,如果屏幕保護程序運行,但屏幕由節能器設置或通過按^⇧⏏鎖定( + 控制 + 彈出)。OSX:檢查屏幕是否鎖定

預先感謝您。

回答

20

首先,你的問題有點混亂。 Shift + Control + Eject和Energy Saver都會讓屏幕進入睡眠狀態,這與鎖定屏幕不同。根據您的其他設置,這也可能需要鎖定屏幕,但這是一個單獨的問題。 IIRC,在Lion上,默認情況下,任何人都不會鎖定屏幕 - 但如果您將屏幕保持睡眠時間超過安全設置&隱私設置的時間,則會鎖定。

無論如何,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將獲得相同的值。

介導這一方面會應用一些限制自舉服務器(例如,security authorize -u foo應該從終端工作,但不是通過ssh),但這些都是不完全記錄,並更改因版本,所以這可能不是你想依靠。相反,要真正地讀你的登錄會話信息

如果你想用這個走得更遠,開始閱讀Multiple User Environments Programming Topics。但是其中一些信息沒有真正記錄在任何地方(例如,SessionGetInfo所引用的Mach級會話和utmpx引用的BSD級會話如何綁定在一起)。許多相關的工具和庫是open source,這可能有所幫助。即使所有這些都沒有告訴你如何去做你想要的東西,它會告訴你你想要的東西,以及用來搜索和提出問題的正確術語,這可能足夠好。

+0

我的意思是「鎖定」,因爲任何的這種狀態鎖定我的電腦由於安全設置(剛需的睡眠和屏幕保護程序的密碼)。 並感謝您的詳細解答。 其實我通過解析當前電源狀態的_ioreg -n IODisplayWrangler_來解決我的任務。 – LevB 2012-07-17 09:05:28

+0

非常感謝!我試圖弄清楚用戶是否在GUI會話中,而python Quartz模塊看起來非常有用。 (但遺憾的是,當我將SSH連接到Mac時,腳本片段會返回與我在GUI控制檯上完全相同的輸出。)我知道我可以檢查特定於SSH的環境變量,但我想得到更準確的... – mpontillo 2012-07-25 20:01:53

+0

由於我的評論太長,以至於不適合,我會將其添加到上面的答案中。 – abarnert 2012-07-27 17:44:36