Тема: AHK: задержка "ухода в СОН"
Есть ли способ , используя этот
http://forum.script-coding.com/viewtopic.php?id=2655
принцип - задержать уход системы win8.1 и win10 в СОН (гибернацию) ,
а перед этим закрыть нужные программы ?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть ли способ , используя этот
http://forum.script-coding.com/viewtopic.php?id=2655
принцип - задержать уход системы win8.1 и win10 в СОН (гибернацию) ,
а перед этим закрыть нужные программы ?
Там написано, при выходе...
Я бы смотрел в сторону таймера. Например в "Электропитание" выставлено уходить в сон через 15 минут, в скрипте указал бы через 14 минут начать закрытие нужных программ, чтобы к 15ой минуте они уже были закрыты. Правда не уверен, что комп пропустит всплеск закрытий прог как бездействие пользователя, чтобы уйти в сон через оставшуюся 1 минуту от 15, заместо заходить на новый 15 минутный круг подсчёта бездействия.
В принципе наверное можно использовать планировщик windows как таймер, который будет запускать только скрипт закрытия, без таймера.
OmTatSat
У меня немного другая задача .
Есть CarPC . Необходимо закрывать некоторые "тяжелые" программы при ВХОДЕ (при нажатии на физическую кнопку) ,
и запускать снова при выходе . Пробовал Autoit - овский скрипт , всё работает, но иногда программы не успевают
выгрузится , что приводит к глюкам . Нужна банальная задержка на 3-5 сек после подачи команды на сон.
Попробуйте поправить этот код под свои нужды
;#NoTrayIcon
#Persistent
SetTimer, RunBeforeShutdown, Off
Gui,+LastFound
hwnd:=WinExist()
DllCall("ShutdownBlockReasonCreate","Uint",hwnd,"Str",A_ScriptFullPath " is still running")
OnMessage(0x11, "WM_QUERYENDSESSION")
Return
WM_QUERYENDSESSION(wParam, lParam)
{
static sdtry = 0
ENDSESSION_Logoff = 0x80000000
If (lParam & ENDSESSION_Logoff) ; User is logging off.
EventType = Logoff
Else ; System is either shutting down or restarting. and
EventType = Shutdown
If (EventType = "Shutdown" and sdtry = 0)
{
sdtry = 1
SetTimer, RunBeforeShutdown, On
Return false ; Tell the OS to Abort the Shutdown/Logoff.
}
Else If (EventType = "Shutdown" and sdtry = 1)
Return true
}
runBeforeShutdown:
SetTimer, RunBeforeShutdown, Off
;-------your code below
MsgBox, 262148, System Hibernation in 20 seconds, Your HTPC is about to be Hibernated.`nAllow it?, %Secs%
IfMsgBox, Yes
{
;hibernate = 1
DllCall("PowrProf\SetSuspendState", "int", 1, "int", 0, "int", 0)
;hibernate = 0
Return
}
IfMsgBox, Timeout
{
;hibernate = 1
DllCall("PowrProf\SetSuspendState", "int", 1, "int", 0, "int", 0)
;hibernate = 0
Return
}
IfMsgBox No
;{
;hibernate = 0
return
;}
;-------
;Shutdown, 1 ; your choice what to do
DllCall("ShutdownBlockReasonDestroy","Uint",hwnd)
Return
В момент выключения появляется MsgBox, и останавливает уход в сон?
#Persistent
DllCall("kernel32.dll\SetProcessShutdownParameters", "UInt", 0x4FF, "UInt", 0)
OnMessage(0x11, "WM_QUERYENDSESSION")
return
WM_QUERYENDSESSION(wParam, lParam)
{
ENDSESSION_LOGOFF = 0x80000000
MsgBox % lParam "`n" wParam "`nENDSESSION_LOGOFF: " (lParam & ENDSESSION_LOGOFF)
return false ; Tell the OS to abort the shutdown/logoff.
}
Источник https://autohotkey.com/board/topic/56513-win7-adaptation-of-intercept-hibernation-script/page-3
serzh82saratov да
Думаю можно убрать msgbox вставить свой код, sleep, потом в режим сна отправить.
вставить свой код, sleep
Ну тогда уже не sleep, а код для закрытия и ожидания завершения процессов.
Под своим кодом подразумевал код закрытия, на счёт ожидания, естественно как вы посоветовали лучше и правильно.
Чуть запутался при тестах, в электропитание на кнопку выключения нужно выбрать выключение а не спящий режим. Тогда скрипт срабатывает, и можно выполнить всё что было сказано выше.
Можно ли поймать момент ухода в настоящий сон, который не гибернация?
Т.е. записать момент ухода в сон и момент возвращения из сна?
Можно читать события из windows system logs.
Приходила такая мысль, но как-то нет очевидного пути для чтения. Думал, может система рассылает какое-нибудь шировещательное сообщение при уходе в сон и можно задействовать OnMessage().
Что удалось выяснить про журнал:
при уходе в сон, в журнале "Система" появляется запись Kernel-Power с кодом 42;
при выходе - Power-Troubleshooter с кодом 1.
Файл журнала не текстовый, поэтому просто прочитать его не выйдет.
* Встроенная утилита wevtutil, с помощью которой можно прочитать последние N событий в конкретном журнале, или экспортировать журнал в текстовый или xml формат. К сожалению функционал какой-либо фильтрации отсутствует.
Команда ниже покажет записи журнала Система в текстовом формате, начиная с последних, в кол-ве 5 штук.
wevtutil qe system /f:text /rd:true /c:5
* Консольная Dumpel.exe от MS для чтения журнала. ссылка для скачивания.
"C:\Program Files (x86)\Resource Kit\dumpel.exe" -f dumpel.txt -l system -d 1 -m "Microsoft-Windows-Power-Troubleshooter" -e 1
* Можно использовать PowerShell, но он потребует махинаций от пользователя для разрешения на запуск скриптов ps,
Get-WinEvent -Path C:\Windows\System32\winevt\Logs\System.evtx
Get-WinEvent -FilterHashtable @{Path="C:\Windows\System32\winevt\Logs\System.evtx";ProviderName="Microsoft-Windows-Power-Troubleshooter";ID=1}
* Можно зарегистрировать триггер на событие журнала, вызывающий скрипт.
Конечно, не хочется включать exe файл в скрипт для распространения.
Можно читать с помощью wevtutil:
https://technet.microsoft.com/ru-ru/lib … s.10).aspx
Спасибо, нашел сейчас https://autohotkey.com/boards/viewtopic.php?t=9658, кажется оно.
Спасибо , буду пробовать ! Но есть одно "НО"
вопрос в шапке относится к win8.1 и win10 .
На 7-ке уход в сон можно задержать , в последних осях это 2 сек ..
seriousstas, а разве в 5 посте не решается ваша проблема?
stealzy
* Встроенная утилита wevtutil, с помощью которой можно прочитать последние N событий в конкретном журнале, или экспортировать журнал в текстовый или xml формат. К сожалению функционал какой-либо фильтрации отсутствует.
Почему отсутствует?
wevtutil qe System /q:*[System[(EventID=42)]]
Malcev, здорово, где вы нашли описание команды?
По вашей ссылке выдает [/q:<Query>], а сама структура <Query> не описывается.
Я не помню уже. Давно было. Наверное гуглил.
Есть интересная WinAPI функция NotifyChangeEventLog, которая позволяет программе получать уведомление о записи в определенный журнал.
В момент записи события в журнал объект под указателем hEvent устанавлиается в сигнальное состояние.
Там пишут, что надо использовать функцию CreateEvent для создания такого объекта.
Может кто знает, как вызвать функцию Autohotkey при изменении hEvent?
SourceName := "Application"
hEventLog := DllCall("advapi32.dll\OpenEventLog", Str, "", Str, SourceName, Ptr)
hEvent := DllCall( "CreateEvent", UInt,0, Int,true, Int,false, UInt,0 ) ; насчет параметров не уверен
DllCall("advapi32.dll\NotifyChangeEventLog", Ptr, hEventLog, Ptr, hEvent)
; Теперь надо как-то отслеживать hEvent, как я понимаю
; RegisterCallback("MyFuncForEventLogProc", "Fast")
MyFuncForEventLogProc() {
MsgBox Новая запись в журнал
}
Если специальные API-функции для отслеживания сигнальных состояний — WaitForSingleObject, WaitForMultipleObjects и т.п.
Эти функции приостанавливают поток до освобождения объекта, как понимаю.
Нашел обсуждение AHK: асинхронный вызов Wait-функции, буду пробовать.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться