Выключить монитор из программы можно, но только если он совместим со стандартом 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 секунд включит его обратно.