Программное выключение монитора

Выключить монитор из программы можно, но только если он совместим со стандартом EnergyStar. Об этом можно не беспокоиться, все современные мониторы удовлетворяют этому условию. Беспокоиться надо о другом. По непонятной причине с сайта на сайт упорно копируют один и тот же код на разных языках программирования, который якобы должен выключить монитор. Вот его вариант на Ассемблере:
; ВНИМАНИЕ! Это НЕПРАВИЛЬНЫЙ код!!!
invoke  GetDesktopWindow
invoke  SendMessage, eax, WM_SYSCOMMAND, SC_MONITORPOWER, 0

Во-первых, через хэндл из функции GetDesktopWindow достучаться до монитора не получится, причем ни в обычном Explorer'e, ни в альтернативных шеллах типа Aston Desktop. Чтобы сообщение дошло до нужного адресата, надо использовать широковещательную рассылку через HWND_BROADCAST. Во-вторых, непонятно откуда взялся последний параметр - 0. В MSDN четко прописано, что для выключения монитора через SC_MONITORPOWER значение lParam должно быть равно 2. Более того, нулевого значения параметра для этого сообщения вообще не предусмотрено. В двух строчках кода две принципиальные ошибки! И это уже далеко не первый случай, когда код из различных популярных источников является заведомо нерабочим. Всем любителям бездумного копипаста очень рекомендую сперва сверяться с первоисточниками, а перед публикацией проверять весь код на практике.

Но хватит о грустном. Правильный код программного выключения монитора будет таким:
;-------------------------------------------------
; Правильный код выключения монитора
;-------------------------------------------------
; В FASM не определена константа HWND_BROADCAST, сделаем это самостоятельно
HWND_BROADCAST = 0FFFFh
; Выключить монитор
invoke  SendMessage, HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2

Для включения монитора обратно достаточно пошевелить мышкой или нажать любую кнопку на клавиатуре. А можно также сделать это из нашей программы. У копипастеров этот код также содержит ошибку, потому что для включения монитора значение lParam должно быть равно -1, а не 1.
;-------------------------------------------------
; Правильный код включения монитора
;-------------------------------------------------
; В FASM не определена константа HWND_BROADCAST, сделаем это самостоятельно
HWND_BROADCAST = 0FFFFh
; Включить монитор
invoke  SendMessage, HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1

В приложении пример программы, которая через секунду после запуска выключит монитор, а еще через 5 секунд включит его обратно.
Теги:
выключение монитора
Добавлено: 10 Апреля 2018 20:38:40 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...