Что нового

[Автоматизация] Клик отмены завершения работы в Windows 8/8.1/10

yevgeniy

Новичок
Сообщения
3
Репутация
0
Помогите разобраться.


Описание работы скрипта:
Пользователь выполняет вход в систему, запускается autoit-скрипт, который следит за сигналом о завершение работы Windows, при этом временно приостановив процесс выключения . После чего ждет появления уведомления о том что какие то программы блокируют выключение (см. скриншот) и с помощью отлова класса этого уведомления - нажимается кнопка отмена. Далее пользователю выводится картинка о том что бы он не переживал - ПК выключится сам, и запускается мне нужный сценарий с последующим завершением работы системы.

Для Windows 7 на просторах интернета был найден скрипт http://pastebin.com/cdZvfYz0, в нем вот такая функция:


Код:
Func Cancel_ShutdownResolver()
    Local $iOldOption, $hWnd
    $iOldOption = Opt("WinTitleMatchMode", 4)
    $hWnd = WinGetHandle("[CLASS:BlockedShutdownResolver]")
    Opt("WinTitleMatchMode", $iOldOption)

    If $hWnd Then
        ; unregister adlib function.
        AdlibUnRegister("Cancel_ShutdownResolver")
        ; Click the cancel button.
        ControlClick($hWnd, "", "[CLASS:Button; INSTANCE:1]")
    EndIf
EndFunc   ;==>Cancel_ShutdownResolver


Для Windows 8/8.1/10 это не работает. Пробовал искать класс уведомления о завершении работы с помощью Au3Info - не получается, оно его блокирует. В autoit я новичок, подскажите пожалуйста как поймать нужный класс в Win 8/8.1/10.
 

Вложения

  • win7_shutdown_info.png
    win7_shutdown_info.png
    17.6 КБ · Просмотры: 16
  • win10_shutdown_info.png
    win10_shutdown_info.png
    22.3 КБ · Просмотры: 21
Автор
yevgeniy

yevgeniy

Новичок
Сообщения
3
Репутация
0
Может кто подскажет чем можно словить нужный класс окна? :stars:
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
А в данной ситуации не работает консольная команда?
shutdown -a
 
Автор
yevgeniy

yevgeniy

Новичок
Сообщения
3
Репутация
0
Vovsla сказал(а):
А в данной ситуации не работает консольная команда?
shutdown -a

Нет, ее можно использовать только если до этого была выполнена shutdown /s /t 300 например.

Начало скрипта для понимания сути:

Код:
; айди завершение сессии
Const $WM_QUERYENDSESSION	= 0x11
; регистрируем событие завершение работы
GUIRegisterMsg($WM_QUERYENDSESSION, "Cancel_Shutdown")
; повышаем приоритет первоочередной отправки сообщения о завершении работы системы нашему скрипту
_WinAPI_SetProcessShutdownParameters(0x03FF)

Func Cancel_Shutdown($hWndGUI, $MsgID, $WParam, $LParam)
   ; LParam == 0x00000000 нормальное выключение/перезагрузка
   ; LParam == 0x40000000 принудительное выключение/перезагрузка, его нельзя отменить
   ; LParam == 0x80000000 завершение сеанса пользователя 
   If StringRegExp($LParam, "^0x0{1,}$") then
	  ; блокируем выключение
	  _ShutdownBlockReasonCreate($hWnd, "Идет резервное копирование документов..")

На этом месте (т.е. после блокировки с помощью _ShutdownBlockReasonCreate) было бы логично отменить завершение работы командой shutdown -a, но это не работает. Единственный выход - это нажимать кнопку Отмены пока идет блокирование (см. скриншот и функцию в первом посте).
 
Верх