Как программно выключить монитор

от admin

ScreenOff — отключаем экран парой кликов мышью

ScreenOff служит для программного отключения экрана, позволяя владельцам портативных компьютеров с Windows выключить дисплей без перевода устройства в спящий режим или закрытия крышки. Пригодится в том случае, когда хочется выключить экран, не прерывая выполняемой задачи и не изменяя привычных настроек. Утилита будет полезна и в связке со специальными компьютерами, операторы которых лишены физического доступа к мониторам.

Установки программа не требует, после запуска доступна в системном трее. Для отключения экрана достаточно выбрать пункт Turn Off в единственном её меню. Снова вернуть изображение на экран можно нажатием любой кнопки клавиатуры или движения мышью. Распространяется ScreenOff бесплатно и с открытым исходным кодом.

Программно отключить монитор

Возникла необходимость на некоторое время отключить программно монитор. Чем могу пользоваться: командной строкой (но вроде невозможно так), c++ (WinAPI наверно), ну на крайний случай c# с его .NET.

Искал, но находил советы вроде SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2); . Это мне не подходит, так как если после запуска такого когда дернуть мышь или клавиатуру, то монитор просыпается. Мне же надо отключить жестко, чтобы включить обратно можно было только программно.

Как программно выключить монитор

Программное отключение и подключение монитора

Программное отключение и подключение монитора

С программным выключением мониторов уже разобрались, сегодня разберем более жесткое действие — отключение. Принципиальную разницу между выключением и отключением, надеюсь, объяснять не надо. Конечно, программно выдернуть видеокабель из системника невозможно, но можно сделать так, чтобы система просто перестала воспринимать этот монитор.

Начинаем, как обычно, с описания структур и констант, которые понадобятся для работы. Что-то уже было, что-то добавилось новое. Главное, что FASM «из коробки» о них ничего не знает.

  1. struct DISPLAY_DEVICE
  2. cb dd ?
  3. DeviceName rb 32
  4. DeviceString rb 128
  5. StateFlags dd ?
  6. DeviceID rb 128
  7. DeviceKey rb 128
  8. ends
  9. struct DEVMODE
  10. dmDeviceName rb 32
  11. dmSpecVersion dw ?
  12. dmDriverVersion dw ?
  13. dmSize dw ?
  14. dmDriverExtra dw ?
  15. dmFields dd ?
  16. dmPosition POINT ?
  17. dmDisplayOrientation dd ?
  18. dmDisplayFixedOutput dd ?
  19. dmColor dw ?
  20. dmDuplex dw ?
  21. dmYResolution dw ?
  22. dmTTOption dw ?
  23. dmCollate dw ?
  24. dmFormName rb 32
  25. dmLogPixels dw ?
  26. dmBitsPerPel dd ?
  27. dmPelsWidth dd ?
  28. dmPelsHeight dd ?
  29. dmDisplayFlags dd ?
  30. dmNup dd ?
  31. dmDisplayFrequency dd ?
  32. dmICMMethod dd ?
  33. dmICMIntent dd ?
  34. dmMediaType dd ?
  35. dmDitherType dd ?
  36. dmReserved1 dd ?
  37. dmReserved2 dd ?
  38. dmPanningWidth dd ?
  39. dmPanningHeight dd ?
  40. ends
  41. EDD_GET_DEVICE_INTERFACE_NAME = 1
  42. ENUM_REGISTRY_SETTINGS = 0FFFFFFFEh
  43. CDS_UPDATEREGISTRY = 1
  44. CDS_NORESET = 10000000h
  45. DM_PELSWIDTH = 00080000h
  46. DM_PELSHEIGHT = 00100000h
  47. DM_POSITION = 00000020h
  1. ; Второй монитор
  2. mov [ device ] , 1
  3. ; Отключить монитор
  4. mov [ dds . cb ] , sizeof . DISPLAY_DEVICE
  5. invoke EnumDisplayDevices , NULL , [ device ] , dds , \
  6. EDD_GET_DEVICE_INTERFACE_NAME
  7. invoke RtlZeroMemory , dmode , sizeof . DEVMODE
  8. mov [ dmode . dmSize ] , sizeof . DEVMODE
  9. mov [ dmode . dmFields ] , DM_PELSHEIGHT + DM_PELSWIDTH + DM_POSITION
  10. invoke ChangeDisplaySettingsEx , dds . DeviceName , dmode , 0 , \
  11. CDS_UPDATEREGISTRY + CDS_NORESET , NULL
  12. invoke ChangeDisplaySettingsEx , NULL , NULL , 0 , 0 , NULL

Подготавливаем настройки устройства, заполняя структуру DEVMODE нулями. После этого применяем кривые настройки монитора при помощи функции ChangeDisplaySettingsEx. Как показывает практика, для отключения монитора достаточно обнулить значения ширины и высоты пиксела, о чем указывают комбинация флагов DM_PELSHEIGHT и DM_PELSWIDTH. При необходимости можно усилить ударную комбинацию флагами DM_DISPLAYFREQUENCY и DM_DISPLAYFLAGS. Использование флага CDS_NORESET сообщает системе, что новые настройки монитора надо применить, но сохранять насовсем их не надо. Повторное применение настроек с нулевыми параметрами динамически изменяет настройки на остальных мониторах. При выполнении кода указанный монитор отключается, но остальные мониторы тоже здорово колбасит, несколько секунд они моргают и перезагружаются, после чего изображение на них восстанавливается. В панели управления отключенный программно монитор выглядит примерно так:

Читать:
Как подключить колонки edifier к компьютеру

Монитор №2 отключен

Монитор №2 отключен

Физически монитор присутствует, но никаких манипуляций с ним выполнить нельзя. На самом мониторе появляется надпись об отсутствии сигнала, после чего он переходит в режим ожидания.

Для подключения монитора достаточно просто вернуть обратно корректные настройки. При помощи функции EnumDisplaySettings загружаем корректные настройки монитора из реестра, после чего точно так же применяем их к нужному устройству. Какие параметры были изменены, такие и надо восстановить, указав соответствующую комбинацию флагов.

  1. ; Второй монитор
  2. mov [ device ] , 1
  3. ; Подключить монитор
  4. mov [ dds . cb ] , sizeof . DISPLAY_DEVICE
  5. invoke EnumDisplayDevices , NULL , [ device ] , dds , \
  6. EDD_GET_DEVICE_INTERFACE_NAME
  7. mov [ dmode . dmSize ] , sizeof . DEVMODE
  8. invoke EnumDisplaySettings , dds . DeviceName , \
  9. ENUM_REGISTRY_SETTINGS , dmode
  10. mov [ dmode . dmFields ] , DM_PELSHEIGHT + DM_PELSWIDTH + DM_POSITION
  11. invoke ChangeDisplaySettingsEx , dds . DeviceName , dmode , 0 , \
  12. CDS_UPDATEREGISTRY + CDS_NORESET , NULL
  13. invoke ChangeDisplaySettingsEx , NULL , NULL , 0 , 0 , NULL

Монитор возвращается к работе, но все равно придется зайти в настройки Персонализации, восстановить обои. Также придется заглянуть и в настройки мониторов, исправить их раскладку и поведение рабочего стола. Не исключено, что слетит еще что-то. Во время экспериментов мне даже пришлось перезагружать компьютер, потому что в какой-то момент изображение на мониторе совсем пропало и не восстанавливалось. Короче, минусов у такого метода гораздо больше, чем плюсов, поэтому использовать его на практике очень не рекомендую. Ну разве что для какого-нибудь вредительства, но это уже остается на вашей совести.

В приложении пример программы с исходным текстом, которая отключает второй монитор, а через 10 секунд подключает его обратно. Будьте осторожны при работе!

Быстрый совет. Как программно выключить монитор

Недавно я рассказывал про то, как не дать уснуть компьютеру. А сегодня расскажу об абсолютно обратной задаче. Как программно выключить монитор. У меня моноблок Sony Vaio и либо я совсем глупый, либо у него и правда нельзя просто выключить монитор. Поэтому перед сном кюмпьютер приходится переводить в режим гибернации или ждать пока монитор выключится по тайм-ауту. Но все решается еще и утилитами.

BlackTop

Эта маленькая утилита, которая висит в трее. По нажатию на CTRL+ALT+B она гасит монитор. На момент написания этого поста сайт программы уже недоступен. Поэтому скачать ее вы можете у меня. Надеюсь, автор не против.

Ярлык на выключение

Еще можно создать ярлык на выключение. Как это сделать знает Google. Если лень, то вот ссылка.

Похожие статьи