Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

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

08.02.2009 | Категория: Образ мышления: 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.

Читать статью целиком »
Просмотров: 13258 | Комментариев: 20

01 02 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.0496 сек.) / Память: 5 Mb
Наверх