2012-07-16 2 views
14

Есть ли способ проверить, заблокирован ли экран в оболочке или applescript? не просто проверить, если заставка работает, но экран заблокирован настройками ЭНЕРГОСОХР или нажав ^⇧⏏ (управления переключением + + выталкивания).OSX: проверьте, заблокирован ли экран

Заранее спасибо.

ответ

20

Во-первых, в вашем вопросе есть путаница. Оба Shift + Control + Eject и Energy Saver помещают экраны в сон, что не то же самое, что блокировка. В зависимости от ваших других настроек это может также привести к блокировке экрана, но это отдельная проблема. IIRC, на Lion, по умолчанию ни один из них никогда не заблокирует экран, но если вы оставите экран спальным дольше, чем время, установленное в Security & Конфиденциальность, которая заблокирует его.

В любом случае, API CGSessionCopyCurrentDictionary позволяет получить информацию обо всех экранных спящих режимах и блокировке экрана для сеанса графического интерфейса пользователя. Если у вас нет сеанса GUI (например, потому что вы работаете в оболочке ssh), или ваш сеанс не владеет консолью (например, потому что у кого-то есть выключение по быстрому пользователю) 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) 

Или, превращая его в однострочника вы можете поместить непосредственно в сценарий оболочки:

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

Теперь, что если у вас есть ssh'd на Mac, а вы также, который в настоящее время входит в эту консоль GUI Mac (как тот же пользователь)?В этом случае ваш сеанс входа в ssh может связываться с сеансом входа в консоль точно так же, как и в локальной сессии входа в терминал. Таким образом, CGSessionCopyCurrentDictionary будет получать одинаковые значения.

Загрузочный сервер, который опосредует это соединение, применит некоторые ограничения (например, security authorize -u foo должен работать с Терминалом, но не над ssh), но они не полностью задокументированы и меняются от версии к версии, так что, вероятно, это не что-то вы хотите положиться. Вместо этого вы хотите действительно прочитать информацию о вашем сеансе регистрации.

Если вы хотите пойти дальше, начните с чтения Multiple User Environments Programming Topics. Но какая-то информация нигде не документирована (например, как связаны сеансы уровня Mach, на которые ссылаются SessionGetInfo и сеансы уровня BSD, на которые ссылаются utmpx). Многие из соответствующих инструментов и библиотек - open source, что может помочь. Даже если вы читаете все это, не говорите, как делать то, что вы хотите, оно точно скажет вам, что вы хотите, и правильные условия для поиска и задавать вопросы, которые могут быть достаточно хорошими.

+0

Я имею в виду «блокировку», потому что любое из этих состояний блокирует мой компьютер из-за настроек безопасности (немедленно требуется пароль для сна и экранной заставки). И спасибо за подробный ответ. На самом деле я решил свою задачу, разобрав _ioreg -n IODisplayWrangler_ для текущего состояния питания. – LevB

+0

Спасибо за это; Я пытался выяснить, был ли пользователь сеансом GUI или нет, а модуль Quartz python выглядит очень полезным. (к сожалению, хотя, когда я нахожусь в SSH'd на Mac, ваш фрагмент сценария возвращает тот же результат, что и в консоли GUI.) Я знаю, что могу проверить переменные среды, специфичные для SSH, но я хотел получите более точное ... – mpontillo

+0

Поскольку мой комментарий слишком длинный, чтобы соответствовать, я добавлю его к ответу выше. – abarnert

Смежные вопросы