Как проверить, заблокирован ли рабочий стол Windows

Вопрос. Как в AutoIt проверить, заблокирован ли рабочий стол Windows?

Что я имею

Возьмем этот пример скрипта AutoIt. Он пингует URL-адрес в бесконечном цикле и сообщает время отклика в подсказке в трее.

While 1
    $responsetime = Ping("www.google.com")
    TrayTip("", $responsetime, 1)
    sleep(5000)
Wend

Желаемый результат

Новый скрипт должен пинговать, только если рабочий стол не заблокирован. Но я не нашел надежного способа проверить это

While 1
    $isLocked = secretFunctionIdontKnow
    If $isLocked = false Then
       Local $responsetime = Ping("www.google.com")
       TrayTip("", $responsetime, 1)
    EndIf
    sleep(5000)
Wend

Совет. Функция WinExist("A") кажется ненадежной. достаточно, потому что рабочий стол без каких-либо открытых окон будет возвращать 0 (= ложь) даже при разблокировке


person nixda    schedule 29.09.2013    source источник
comment
Вы не получите заголовок с экрана блокировки с помощью WinGetTitle... :-(   -  person Samoth    schedule 30.09.2013
comment
А вот Экран блокировки из класса TaskSwitcherWnd. Таким образом, вы можете просто увидеть, имеет ли результат WinGetClassList эту запись в своей первой позиции... Это также будет верно, если вы используете {Alt}+{Tab} для переключения программ, но я думаю, что это справедливый компромисс, чтобы не выполнять пинг при переключении программ, поскольку хорошо.   -  person Samoth    schedule 30.09.2013


Ответы (1)


Основываясь на моих комментариях выше, вы можете использовать следующее secretFunctionIdontKnow ;-)

Func secretFunctionIdontKnow()
    $classes = StringSplit(WinGetClassList("[ACTIVE]"), @LF, 2)
    Return $classes[0] == "TaskSwitcherWnd"
EndFunc

К счастью, переключатель программ не имеет возвращаемого значения TaskSwitcherWnd, поэтому, похоже, это работает для меня в Windows 7 Enterprise SP1 64 Bit...

Не пропустите скобки в вызове функции ;-)

person Samoth    schedule 30.09.2013
comment
Это может быть быстрее, если вы не используете StringSplit, а StringLeft($list, StringInStr($list, @LF) - 1)... на ваше усмотрение. - person Samoth; 30.09.2013
comment
+1 Эта функция работает. (кстати, что еще лучше, так это то, что {Alt}+{Tab} не дает мне истинного ^^) - person nixda; 01.10.2013
comment
Да, это то, что я тоже испытал... Но когда вы перемещаете курсор захвата из Инструмента информации окна AutoIt над переключателем программ, который происходит с {Alt}{Tab}, вы получите класс TaskSwitcherWnd в результате ... В любом случае окно TaskSwitcherWnd кажется не активным, а окном без класса, распознаваемого AutoIt, поскольку функция WinGetClassList("[ACTIVE]") вернет "". Таким образом, мой secretFunctionIdontKnow возвращает ложь... альт. - person Samoth; 02.10.2013