1

Тема: AHK: Выключение монитора по горячей клавише

Нажатие на F11 выключит монитор. Чтобы включить, достаточно подвигать мышью или нажать какую-либо клавишу. Пауза перед DllCall необходима, т.к. иначе монитор может выключиться раньше, чем будет отпущена клавиша, а отпускание клавиши будет воспринято как включающий сигнал.

F11::
  HWND_BROADCAST = 0xFFFF
  WM_SYSCOMMAND = 0x0112
  SC_MONITORPOWER = 0xF170

  Sleep, 1500
  DllCall("SendMessage", "UInt", HWND_BROADCAST
                       , "UInt", WM_SYSCOMMAND
                       , "UInt", SC_MONITORPOWER
                       , "Int", 2)
Return

2

Re: AHK: Выключение монитора по горячей клавише

Э, маразм меня подвёл. Собственно, в справке уже есть пример на эту тему, хотя и не идентичный.

F11::
  Sleep, 1000
  SendMessage, 0x112, 0xF170, 2,, Program Manager  
Return

; 0x112 - сообщение WM_SYSCOMMAND, 0xF170 - сообщение SC_MONITORPOWER.
; Примечание: для включения монитора используйте -1 вместо 2.
; Используйте 1 вместо 2, чтобы отправить монитор в спящий режим.

Но что-то я не заметил особой разницы между 2 и 1.

3

Re: AHK: Выключение монитора по горячей клавише

А вот здесь я постил вариант, в котором после выключения, монитор включается только клавишей 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 ; закончить обработку горячей клавиши
;-----------------------------------------------------------------------------
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).