Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Выключить монитор из программы можно, но только если он совместим со стандартом EnergyStar. Об этом можно не беспокоиться, все современные мониторы удовлетворяют этому условию. Беспокоиться надо о другом. По непонятной причине с сайта на сайт упорно копируют один и тот же код на разных языках программирования, который якобы должен выключить монитор. Вот его вариант на Ассемблере:
  1. ; ВНИМАНИЕ! Это НЕПРАВИЛЬНЫЙ код!!!
  2. invoke  GetDesktopWindow
  3. invoke  SendMessage, eax, WM_SYSCOMMAND, SC_MONITORPOWER, 0
Во-первых, через хэндл из функции GetDesktopWindow достучаться до монитора не получится, причем ни в обычном Explorer'e, ни в альтернативных шеллах типа Aston Desktop. Чтобы сообщение дошло до нужного адресата, надо использовать широковещательную рассылку через HWND_BROADCAST. Во-вторых, непонятно откуда взялся последний параметр - 0. В MSDN четко прописано, что для выключения монитора через SC_MONITORPOWER значение lParam должно быть равно 2. Более того, нулевого значения параметра для этого сообщения вообще не предусмотрено. В двух строчках кода две принципиальные ошибки! И это уже далеко не первый случай, когда код из различных популярных источников является заведомо нерабочим. Всем любителям бездумного копипаста очень рекомендую сперва сверяться с первоисточниками, а перед публикацией проверять весь код на практике.

Но хватит о грустном. Правильный код программного выключения монитора будет таким:
  1. ;-------------------------------------------------
  2. ; Правильный код выключения монитора
  3. ;-------------------------------------------------
  4. ; В FASM не определена константа HWND_BROADCAST, сделаем это самостоятельно
  5. HWND_BROADCAST = 0FFFFh
  6. ; Выключить монитор
  7. invoke  SendMessage, HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2
Для включения монитора обратно достаточно пошевелить мышкой или нажать любую кнопку на клавиатуре. А можно также сделать это из нашей программы. У копипастеров этот код также содержит ошибку, потому что для включения монитора значение lParam должно быть равно -1, а не 1.
  1. ;-------------------------------------------------
  2. ; Правильный код включения монитора
  3. ;-------------------------------------------------
  4. ; В FASM не определена константа HWND_BROADCAST, сделаем это самостоятельно
  5. HWND_BROADCAST = 0FFFFh
  6. ; Включить монитор
  7. invoke  SendMessage, HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1
Справедливости ради стоит отметить, что этот способ фактически не выключает монитор, а переводит его в режим ожидания. Чтобы выйти из этого режима достаточно просто пошевелить мышкой или нажать любую кнопку на клавиатуре. Для полноценного выключения мониторов придется воспользоваться более сложным способом.

В приложении пример программы, которая через секунду после запуска выключит монитор, а еще через 5 секунд включит его обратно.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Monitor.OFF.Demo.zip (1,174 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 14497 | Комментариев: 20

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (01.09.2020 в 12:49):
Чье-то окно висит, не дает ответа. Лучше этот способ вообще не использовать, он безнадежно устарел.
Petya (01.09.2020 в 12:41):
Ммм, у меня одного SendMessage не возвращает управление и программа не завершается?
pRoger (02.02.2014 в 19:15):
А под линуксом как?
serzh82saratov (07.04.2012 в 19:12):
А как выключить один из двух мониторов?

не понял как подписаться, [del]
если можно на мыло.Премного благодарен.
XXX (22.03.2012 в 14:43):
В Radminе я такой опции не нашел. Поэтому и занимаюсь ерундой.
ManHunter (22.03.2012 в 14:23):
Не занимайся ерундой. Во всех нормальных системах удаленного администрирования есть опция "гасить монитор на время подключения".
XXX (22.03.2012 в 14:16):
invoke BlockInput,1 - блокирует ввод с клавиатуры и движение мышью, но и Radmin блокируется тоже. Может не отключать монитор, а отключить вывод изображения на монитор. Как это сделать?
XXX (22.03.2012 в 13:39):
Я использую Radmin и хочу отключать монитор управляемого компьютера. После отключения мыши и клавиатуры будет ли работать Radmin? Как сделать отключение мыши и клавиатуры в FASMe?
ManHunter (22.03.2012 в 13:34):
Заблокировать мышку и клавиатуру.
XXX (22.03.2012 в 13:33):
Как сделать так, чтобы после программного выключения монитора его можно было включить только программно или перезагрузкой, то есть включение монитора не происходило после шевеления мышкой или нажатия любой кнопки на клавиатуре?
brute (24.01.2012 в 06:32):
у меня ноут sony_vaio, кнопки выключения монитора нет, а выключать на ночь надо быстро (не ждать 1-3 мин, пока сам выключится) - то есть программа нужна (тем более, что на PB - одна строчка). Однако, заметил, что после переустановки Win_XP (zver или chip) монитор не выключается! Оказалось, что для выключения необходимы родные дрова монитора, хотя других внешних признаков что они нужны (разрешение, цвета) нет - монитор хорошо работает с дровами из устанавливаемого образа.
п.с. у Фленова М.Е. в трудах "Программирование на.. глазами хакера" пример действительно не работает! Сдается мне, что Фленов - это Mikl__с wasma, или же пример с битмапой (дед мороз в шапочке) Фленов спёр у Mikl__'a..
AnAstAsiA (08.05.2011 в 13:21):
Огромное спасибо!!!
ManHunter (16.01.2011 в 18:46):
Включить головной мозг, перестать использовать компоненты, выучить WinAPI и сделать красиво.
fletch (16.01.2011 в 18:43):
А как сделать аналогичное в делфи???
ManHunter (04.12.2009 в 21:49):
Видимо это надо спрашивать на ресурсах, посвященных C++, а не здесь.
Андрей (04.12.2009 в 21:47):
Спасибо большое, переписал на C++, но не могу найти ошибку, помогите.

[удалено]
k0l0p0k (18.09.2009 в 20:12):
работает,однако :)
Vladislav (19.07.2009 в 17:28):
Выражаю благодарность за разъяснительную работу и борьбу с копипастерами :)
Ку! (30.04.2009 в 16:06):
А где ж блин отключение только одного монитора? ;) Видимо не все так просто ;)
Bagir (25.04.2009 в 00:52):
Отличные разъяснения и главное рабочий пример. Большое Вам спасибо!

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0042 сек.) / Память: 4.5 Mb
Наверх