Всем добрый вечер! Собственно недавно заинтересовался как выключить и включить монитор. Вроде бы разобрался, но тут возникло одно НО. По факту все сейчас современные мониторы поддерживают VCP code D6h с 1 и 4, да и если что проверить эту поддержку не сложно - мало ли вдруг. Но некоторое производители используют свои VCP code например как я прочитал на хабраре Samsung использует VCP code E1h с 0 и 1. И например у меня как раз Самсунговский монитор и хоть он тоже поддерживает VCP code D6h с 1 и 4, но по факту корректно работает только с своими VCP code E1h с 0 и 1, а с стандартным только выключается но программно не включается. По стандарту MCCS во всех мониторах должно присутствовать VCP code C8h для проверки создателя чипа монитора благодаря чему можно уже по заранее готовой таблице использовать только доступные VCP code и определённые производителем. Я это виду к тому может кто в этом деле разбирается и знает где можно взять информацию о поддерживаемых VCP code для конкретного производителя чипа монитора?
Может кто не против проверить? Как себя поведёт VCP code D6h с 1 и 4, само собой если только у вас монитор отличный от Samsung. Вот код: Код (ASM): format PE GUI 4.0 entry start include 'win32ax.inc' PHYSICAL_MONITOR_DESCRIPTION_SIZE = 128 MONITOR_DEFAULTTONULL = 0x00000000 MONITOR_DEFAULTTOPRIMARY = 0x00000001 MONITOR_DEFAULTTONEAREST = 0x00000002 ;---------------------------- struct PHYSICAL_MONITOR hPhysicalMonitor dd ? szPhysicalMonitorDescription dw PHYSICAL_MONITOR_DESCRIPTION_SIZE dup(?) ends section '.text' code readable executable start: ;Что бы не создавать окно получим схендл рабочего стола invoke GetDesktopWindow mov ebp,eax ;Получим хендл "виртуального" монитора связаного с окном invoke MonitorFromWindow,ebp,MONITOR_DEFAULTTONEAREST mov ebp,eax ;Получим количество мониторов связаных с окном - само собой в когда в системе один монитор то = 1 invoke GetNumberOfPhysicalMonitorsFromHMONITOR,ebp,NumberOfPhysicalMonitors ;Заполняем структуру invoke GetPhysicalMonitorsFromHMONITOR,ebp,[NumberOfPhysicalMonitors],aPhysicalMonitorArray ;Получим хендл первого монитора mov ebx,[aPhysicalMonitorArray.hPhysicalMonitor] ;Выключим монитор invoke SetVCPFeature,ebx,0xD6,4 ;Сделаем паузу что бы монитор успел выключиться прежде чем включать его invoke Sleep,10000 ;Включим монитор invoke SetVCPFeature,ebx,0xD6,1 ;Освободим invoke DestroyPhysicalMonitors,[NumberOfPhysicalMonitors],aPhysicalMonitorArray invoke ExitProcess,0 section '.data' data readable writeable NumberOfPhysicalMonitors dd ? aPhysicalMonitorArray PHYSICAL_MONITOR db sizeof.PHYSICAL_MONITOR*5 dup(?);Что бы не замарачиваться с выдилением памяти выделим для 5 структур section '.idata' import data readable writeable library kernel,'Kernel32.dll',\ User32,'User32.dll',\ Dxva2,'Dxva2.dll' import kernel,\ ExitProcess,'ExitProcess',\ Sleep,'Sleep' import User32,\ MonitorFromWindow,'MonitorFromWindow',\ GetDesktopWindow,'GetDesktopWindow' import Dxva2,\ DestroyPhysicalMonitors,'DestroyPhysicalMonitors',\ GetPhysicalMonitorsFromHMONITOR,'GetPhysicalMonitorsFromHMONITOR',\ GetNumberOfPhysicalMonitorsFromHMONITOR,'GetNumberOfPhysicalMonitorsFromHMONITOR',\ GetCapabilitiesStringLength,'GetCapabilitiesStringLength',\ GetVCPFeatureAndVCPFeatureReply,'GetVCPFeatureAndVCPFeatureReply',\ CapabilitiesRequestAndCapabilitiesReply,'CapabilitiesRequestAndCapabilitiesReply',\ GetMonitorTechnologyType,'GetMonitorTechnologyType',\ SetVCPFeature,'SetVCPFeature' А вот уже готовая программа: