OSX: sprawdź, czy ekran jest zablokowany

Czy Jest jakiś sposób, aby sprawdzić, czy screen jest zablokowany w shell lub applescript? Nie tylko sprawdź, czy wygaszacz ekranu jest uruchomiony, ale ekran jest zablokowany przez ustawienia oszczędzania energii lub naciskając ⌃⇧⏏ (shift+Kontrola+eject ).

Z góry dziękuję.

Author: LevB, 2012-07-16

1 answers

Po pierwsze, jest trochę zamieszania w twoim pytaniu. Zarówno Shift+Control+Eject, jak i Energy Saver uśpiają ekrany, co nie jest tym samym, co ich blokowanie. W zależności od innych ustawień może to również wiązać się z zablokowaniem ekranu, ale jest to osobny problem. IIRC, na Lion, domyślnie, żaden z nich nigdy nie zablokuje ekranu-ale jeśli pozostawisz ekran uśpiony na dłużej niż czas ustawiony w Bezpieczeństwo i prywatność, To Go zablokuje.

W każdym razie, API CGSessionCopyCurrentDictionary pozwala uzyskać informacje na temat uśpienia ekranu i blokady ekranu, dla sesji GUI. Jeśli nie masz sesji GUI (np. dlatego, że działasz w powłoce ssh) lub Twoja sesja nie jest własnością konsoli (np. dlatego, że ktoś cię wyłączył), nie będziesz w stanie uzyskać tych informacji, ale przynajmniej będziesz w stanie wykryć te przypadki.

Jest to jedyny mechanizm, jaki znam, który działa dla wszystkich systemów operacyjnych od 10.5 (właściwie 10.3) do 10.8 (ale to nie znaczy, że tylko tam jest...).

Nie ma bezpośredniego sposobu na wywołanie tego z bash lub AppleScript. Możesz jednak użyć swojego ulubionego mostu (PyObjC, MacRuby, ASOC itp.) nazywając ją pośrednio. Oto przykład użycia Pythona:

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

Oto jak zinterpretować odpowiedź:

  • Jeśli nic nie odzyskasz, nie masz sesji interfejsu użytkownika.
  • Jeśli słownik ma kCGSSessionOnConsoleKey = 0, lub nie występuje, albo Twoja sesja GUI nie jest własnością konsoli, albo ekrany konsoli śpią.
  • Jeśli słownik ma CGSSessionScreenIsLocked = 1, ekrany są zablokowane.

Jedynym problemem jest to, że kCGSSessionOnConsoleKey jest 0 (lub brak), a CGSSessionScreenIsLocked jest 1. W takim przypadku albo uśpiłeś ekrany i je zablokowałeś, albo ktoś inny zabrał konsolę i zablokował ekrany(z lub bez uśpienia). I nie jestem pewien, czy jest sposób, aby odróżnić te sprawy. Ale jeśli szukasz "nie próbuj wyświetlać okna dialogowego, ponieważ użytkownik będzie musiał najpierw odblokować ekran", oba te przypadki oznaczają "Nie wyświetlaj okna dialogowego".

Więc to powinno dać ci to, czego chcesz:

#!/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)

Lub, zamieniając go w jednolinijkowy, można umieścić bezpośrednio w skrypcie powłoki:

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

Teraz, co jeśli masz ssh na Macu, i jesteś również aktualnie zalogowany do konsoli GUI tego Maca (jako ten sam użytkownik)? W takim przypadku sesja logowania ssh może komunikować się z sesją logowania konsoli w dokładnie taki sam sposób że sesji logowania lokalnego terminala. Tak więc CGSessionCopyCurrentDictionary otrzyma te same wartości.

Serwer bootstrap, który pośredniczy w tym połączeniu, zastosuje pewne ograniczenia (np. {[8] } powinien działać z terminala, ale nie przez ssh), ale nie są one w pełni udokumentowane i zmieniają się z wersji na wersję, więc prawdopodobnie nie jest to coś, na czym chcesz polegać. Zamiast tego chcesz przeczytać informacje o sesji logowania]}

Jeśli chcesz iść dalej z tym, zacznij od czytania wielu tematów programowania środowisk Użytkownika . Ale niektóre informacje nie są nigdzie udokumentowane (np. jak sesje na poziomie Mach, do których odwołuje się SessionGetInfo i sesje na poziomie BSD, do których odwołuje się utmpx są ze sobą powiązane). Wiele odpowiednich narzędzi i Bibliotek to open source , które mogą pomóc. Nawet jeśli przeczytanie tego wszystkiego nie powie Ci, jak robić to, co chcesz, powie Ci dokładnie to, czego chcesz i odpowiednie warunki do użyj do wyszukiwania i zadawania pytań, które mogą być wystarczająco dobre.

 30
Author: abarnert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 17:55:37