Что нового

Как отследить завершение работы ПК(ОС)?

agikon

Знающий
Сообщения
789
Репутация
17
Подскажите пожалуйста, как отследить завершенеи работы пк, ну или другими словами операционной системы.То есть проще говоря самое простое выключение компьютера, когда нажимаем Пуск-выключить пк.
Вот эту команду можно отследить?
Хочу чтобы в момент появления этой команды скрипт быстренько кое-что делал.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
При выключении компьютера или при выходе пользователя скрипт завершает работу. А при завершении скрипта AutoIt может выполнить функцию, зарегистрированную через
Код:
OnAutoItExitRegister()
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
InnI [?]
При выключении компьютера или при выходе пользователя скрипт завершает работу. А при завершении скрипта AutoIt может выполнить функцию, зарегистрированную через
спасибо именно то что и требовалось.
вот только один ньюансик, как понять успеет ли функция проделать свою работу без практики? виндовс сколько отведёт времени на это дело? я вот не совсем понимаю этот механизм по времени.
или это только надо практически проверять, запустить скрипт ипотом уже смотреть успела функция выполнится или нет.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
agikon
В теории, Windows будет ждать завершения процессов и, в случае необходимости, выведет список мешающих выходу программ. Например, будет ждать завершения этого скрипта
Код:
OnAutoItExitRegister("OnExit")

While Sleep(1000)
WEnd

Func OnExit()
  MsgBox(0, "", "Препятствуем выключению")
EndFunc

Но всё равно, работу любого скрипта нужно проверять на практике.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
тебе нужно запустить gpedit.msc, там найти конфигурация комп->конф виндуз->сценарии->завершение работы. Туда ты кладешь vbs скрипт
Код:
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec=WshShell.Exec ("D:\ботва\autoit\1\logout.exe")
 Do While oExec.Status = 0
      WScript.Sleep 100
  Loop
где пишешь путь к своему скрипту. Он будет выполнятся при выключении компа любое время.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
давненько уже обсуждалась тема о том, как отловить завершение работы. теперь в справке есть тот пример.

Код:
#include <GUIConstantsEx.au3>
#include <WinAPISys.au3>

_WinAPI_SetProcessShutdownParameters(0x03FF)
$hForm = GUICreate('')
GUIRegisterMsg(0x0011, 'WM_QUERYENDSESSION')
_WinAPI_ShutdownBlockReasonCreate($hForm, 'This application is blocking system shutdown because saving critical data is in progress.')

While 1
	Sleep(1000)
WEnd

Func WM_QUERYENDSESSION($hWnd, $Msg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			If _WinAPI_ShutdownBlockReasonQuery($hForm) Then Return 0 ; вместо блокирования вписываем свою функцию. либо блокируем на время, пока не отработает функция
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_QUERYENDSESSION
 
Верх