Программное отключение и подключение монитора
Программное отключение и подключение монитора
С программным выключением мониторов уже разобрались, сегодня разберем более жесткое действие - отключение. Принципиальную разницу между выключением и отключением, надеюсь, объяснять не надо. Конечно, программно выдернуть видеокабель из системника невозможно, но можно сделать так, чтобы система просто перестала воспринимать этот монитор.
Начинаем, как обычно, с описания структур и констант, которые понадобятся для работы. Что-то уже было, что-то добавилось новое. Главное, что FASM "из коробки" о них ничего не знает.
Code (Assembler) : Убрать нумерацию
- struct DISPLAY_DEVICE
- cb dd ?
- DeviceName rb 32
- DeviceString rb 128
- StateFlags dd ?
- DeviceID rb 128
- DeviceKey rb 128
- ends
- struct DEVMODE
- dmDeviceName rb 32
- dmSpecVersion dw ?
- dmDriverVersion dw ?
- dmSize dw ?
- dmDriverExtra dw ?
- dmFields dd ?
- dmPosition POINT ?
- dmDisplayOrientation dd ?
- dmDisplayFixedOutput dd ?
- dmColor dw ?
- dmDuplex dw ?
- dmYResolution dw ?
- dmTTOption dw ?
- dmCollate dw ?
- dmFormName rb 32
- dmLogPixels dw ?
- dmBitsPerPel dd ?
- dmPelsWidth dd ?
- dmPelsHeight dd ?
- dmDisplayFlags dd ?
- dmNup dd ?
- dmDisplayFrequency dd ?
- dmICMMethod dd ?
- dmICMIntent dd ?
- dmMediaType dd ?
- dmDitherType dd ?
- dmReserved1 dd ?
- dmReserved2 dd ?
- dmPanningWidth dd ?
- dmPanningHeight dd ?
- ends
- EDD_GET_DEVICE_INTERFACE_NAME = 1
- ENUM_REGISTRY_SETTINGS = 0FFFFFFFEh
- CDS_UPDATEREGISTRY = 1
- CDS_NORESET = 10000000h
- DM_PELSWIDTH = 00080000h
- DM_PELSHEIGHT = 00100000h
- DM_POSITION = 00000020h
Code (Assembler) : Убрать нумерацию
- ; Второй монитор
- mov [device],1
- ; Отключить монитор
- mov [dds.cb],sizeof.DISPLAY_DEVICE
- invoke EnumDisplayDevices,NULL,[device],dds,\
- EDD_GET_DEVICE_INTERFACE_NAME
- invoke RtlZeroMemory,dmode,sizeof.DEVMODE
- mov [dmode.dmSize],sizeof.DEVMODE
- mov [dmode.dmFields],DM_PELSHEIGHT+DM_PELSWIDTH+DM_POSITION
- invoke ChangeDisplaySettingsEx,dds.DeviceName,dmode,0,\
- CDS_UPDATEREGISTRY+CDS_NORESET,NULL
- invoke ChangeDisplaySettingsEx,NULL,NULL,0,0,NULL
Монитор №2 отключен
Физически монитор присутствует, но никаких манипуляций с ним выполнить нельзя. На самом мониторе появляется надпись об отсутствии сигнала, после чего он переходит в режим ожидания.
Для подключения монитора достаточно просто вернуть обратно корректные настройки. При помощи функции EnumDisplaySettings загружаем корректные настройки монитора из реестра, после чего точно так же применяем их к нужному устройству. Какие параметры были изменены, такие и надо восстановить, указав соответствующую комбинацию флагов.
Code (Assembler) : Убрать нумерацию
- ; Второй монитор
- mov [device],1
- ; Подключить монитор
- mov [dds.cb],sizeof.DISPLAY_DEVICE
- invoke EnumDisplayDevices,NULL,[device],dds,\
- EDD_GET_DEVICE_INTERFACE_NAME
- mov [dmode.dmSize],sizeof.DEVMODE
- invoke EnumDisplaySettings,dds.DeviceName,\
- ENUM_REGISTRY_SETTINGS,dmode
- mov [dmode.dmFields],DM_PELSHEIGHT+DM_PELSWIDTH+DM_POSITION
- invoke ChangeDisplaySettingsEx,dds.DeviceName,dmode,0,\
- CDS_UPDATEREGISTRY+CDS_NORESET,NULL
- invoke ChangeDisplaySettingsEx,NULL,NULL,0,0,NULL
В приложении пример программы с исходным текстом, которая отключает второй монитор, а через 10 секунд подключает его обратно. Будьте осторожны при работе!
Просмотров: 1922 | Комментариев: 3
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(01.12.2020 в 12:30):
На самом деле подобный код действительно является если не вредоносным, то уж точно крайне нежелательным к использованию, о чем я сам предупреждаю в статье.
NeshAliNehrin
(01.12.2020 в 12:03):
Спасибо за возможность расширить кругозор.
Антивирус Касперского отправил архив в топку и попытался назвать сайт неблагонадёжным, что удручает.
Однако ситуация, когда пользователей интернета держат за подростков, клеящих жвачку на поручни, довольно неприятная.
Сохраняю доверие как к автору статей, так и к контенту сайта. Мой комментарий - просто факт возмущения тем, что хороший досуг портят необъективные, совершено посторонние люди.
Антивирус Касперского отправил архив в топку и попытался назвать сайт неблагонадёжным, что удручает.
Однако ситуация, когда пользователей интернета держат за подростков, клеящих жвачку на поручни, довольно неприятная.
Сохраняю доверие как к автору статей, так и к контенту сайта. Мой комментарий - просто факт возмущения тем, что хороший досуг портят необъективные, совершено посторонние люди.
Aleksandr
(10.11.2020 в 21:14):
Благодарю за столь познавательную статью ув. ManHunter
Добавить комментарий
Заполните форму для добавления комментария