А вот здесь я постил вариант, в котором после выключения, монитор включается только клавишей ESC, и не включается ни от шевеления мышью, ни от нажатия других клавиш.
Чтобы было в куче, постну его сюда:
Loop
{
Sleep, 400 ; пауза, чтобы не обрабатывалась вызывающая клавиша (мышь), и не молотить лишнего
SendMessage, 0x112, 0xF170, 2,, Program Manager ; 0x112 is WM_SYSCOMMAND, 0xF170 is SC_MONITORPOWER.
; Используйте 2, чтобы выключить монитор
; Используйте -1 вместо 2, чтобы включить монитор
; Используйте 1 вместо 2, чтобы активизировать режим "малой мощности" дисплея
}
~ESC:: ; ESC - завершить скрипт
SendMessage, 0x112, 0xF170, -1,, Program Manager ; включить монитор
ExitApp ; завершить скрипт
Return ; для красоты :)
А в моём постоянно загруженном скрипте заюзан немного другой вариант: при обычном нажатии WIN+PgUp включается заставка, при удержании WIN и ДВОЙНОМ нажатии PgUp, выключается монитор.
Включается монитор только после шевеления мышью.
; ========== ЗАСТАВКА/ВЫКЛЮЧЕНИЕ МОНИТОРА ==================
#PgUp:: ; WIN+PgUp - заставка (ДВОЙНОЕ нажатие - выключение монитора)
AppsKey & PgUp:: ; AppsKey+PgUp - заставка (ДВОЙНОЕ нажатие - выключение монитора)
;-----------------------------------------------------------------------------
If Count_Presses > 0 ; если таймер уже запущен
{
Count_Presses += 1 ; плюсуем каждое нажатие клавиши (число будет обрабатываться в подпрограмме соответствующего таймера)
Return ; закончить обработку горячей клавиши (ее дальнейшую обработку уже определяет таймер и его подпрограмма)
}
; Иначе - это первое нажатие из новой серии
Count_Presses = 1 ; выставляем флаг, что клавиша один раз нажата
SetTimer, Timer_Presses_5, 400 ; переходить к указанной подпрограмме через каждые 400 миллисекунд
Return ; закончить обработку горячей клавиши
Timer_Presses_5: ; подпрограмма действий в зависимости от количества нажатий
SetTimer, Timer_Presses_5, Off ; выключить таймер
If Count_Presses = 1 ; если клавиша нажата однажды...
SendMessage, 0x112, 0xF140, 0,, Program Manager ; запустить скринсейвер (0x112 is WM_SYSCOMMAND, and 0xF140 is SC_SCREENSAVE)
Else If Count_Presses = 2 ; если клавиша нажата дважды...
{
CoordMode, Mouse, Screen ; установить абсолютные координаты для мыши
MouseGetPos, XStart, YStart ; получить начальные координаты мыши
Loop ; начать цикл с выключением монитора
{
Sleep, 200 ; пауза, чтобы не обрабатывалась вызывающая клавиша
SendMessage, 0x112, 0xF170, 1,, Program Manager ; активизировать режим "малой мощности" монитора (0x112 is WM_SYSCOMMAND, 0xF170 is SC_MONITORPOWER)
; Используйте 2, чтобы выключить монитор
; Используйте -1 вместо 2, чтобы включить монитор
; Используйте 1 вместо 2, чтобы активизировать режим "малой мощности" монитора
Sleep, 200 ; пауза, чтобы не молотить лишнего
MouseGetPos, XCurrent, YCurrent ; получить текущие координаты мыши
If ( XCurrent <> XStart ) ; если мышь передвинута
Break ; закончить цикл с выключением монитора
}
}
Count_Presses = ; сбросить счет и подготовится к следующему ряду нажатий
Return ; закончить обработку горячей клавиши
;-----------------------------------------------------------------------------
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).