Выключить монитор

Тема в разделе "WASM.WIN32", создана пользователем hapr, 5 июн 2018.

  1. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    42
    Всем добрый вечер!
    Собственно недавно заинтересовался как выключить и включить монитор. Вроде бы разобрался, но тут возникло одно НО. По факту все сейчас современные мониторы поддерживают 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 для конкретного производителя чипа монитора?
     
  2. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    42
    Может кто не против проверить? Как себя поведёт VCP code D6h с 1 и 4, само собой если только у вас монитор отличный от Samsung.
    Вот код:
    Код (ASM):
    1.  
    2. format PE GUI 4.0
    3. entry start
    4. include 'win32ax.inc'
    5. PHYSICAL_MONITOR_DESCRIPTION_SIZE  =  128
    6. MONITOR_DEFAULTTONULL  =  0x00000000
    7. MONITOR_DEFAULTTOPRIMARY  =  0x00000001
    8. MONITOR_DEFAULTTONEAREST  =  0x00000002
    9. ;----------------------------
    10. struct PHYSICAL_MONITOR
    11.  hPhysicalMonitor  dd  ?
    12.  szPhysicalMonitorDescription  dw PHYSICAL_MONITOR_DESCRIPTION_SIZE dup(?)
    13. ends
    14.  
    15. section '.text' code readable executable
    16.   start:
    17.   ;Что бы не создавать окно получим схендл рабочего стола
    18.   invoke  GetDesktopWindow
    19.   mov  ebp,eax
    20.   ;Получим хендл "виртуального" монитора связаного с окном
    21.   invoke  MonitorFromWindow,ebp,MONITOR_DEFAULTTONEAREST
    22.   mov  ebp,eax
    23.   ;Получим количество мониторов связаных  с окном - само собой в когда в системе один монитор то = 1
    24.   invoke  GetNumberOfPhysicalMonitorsFromHMONITOR,ebp,NumberOfPhysicalMonitors
    25.   ;Заполняем структуру
    26.   invoke  GetPhysicalMonitorsFromHMONITOR,ebp,[NumberOfPhysicalMonitors],aPhysicalMonitorArray
    27.   ;Получим хендл первого монитора
    28.   mov  ebx,[aPhysicalMonitorArray.hPhysicalMonitor]
    29.   ;Выключим монитор
    30.   invoke  SetVCPFeature,ebx,0xD6,4
    31.   ;Сделаем паузу что бы монитор успел выключиться прежде чем включать его
    32.   invoke  Sleep,10000
    33.   ;Включим монитор
    34.   invoke  SetVCPFeature,ebx,0xD6,1
    35.   ;Освободим
    36.   invoke  DestroyPhysicalMonitors,[NumberOfPhysicalMonitors],aPhysicalMonitorArray
    37.   invoke  ExitProcess,0
    38. section '.data' data readable writeable
    39.  NumberOfPhysicalMonitors  dd  ?
    40.  aPhysicalMonitorArray  PHYSICAL_MONITOR
    41.   db  sizeof.PHYSICAL_MONITOR*5 dup(?);Что бы не замарачиваться с выдилением памяти выделим для 5 структур
    42. section '.idata' import data readable writeable
    43.   library kernel,'Kernel32.dll',\
    44.   User32,'User32.dll',\
    45.   Dxva2,'Dxva2.dll'
    46.   import kernel,\
    47.   ExitProcess,'ExitProcess',\
    48.   Sleep,'Sleep'
    49.  import User32,\
    50.   MonitorFromWindow,'MonitorFromWindow',\
    51.   GetDesktopWindow,'GetDesktopWindow'
    52.  
    53.  import Dxva2,\
    54.   DestroyPhysicalMonitors,'DestroyPhysicalMonitors',\
    55.   GetPhysicalMonitorsFromHMONITOR,'GetPhysicalMonitorsFromHMONITOR',\
    56.   GetNumberOfPhysicalMonitorsFromHMONITOR,'GetNumberOfPhysicalMonitorsFromHMONITOR',\
    57.   GetCapabilitiesStringLength,'GetCapabilitiesStringLength',\
    58.   GetVCPFeatureAndVCPFeatureReply,'GetVCPFeatureAndVCPFeatureReply',\
    59.   CapabilitiesRequestAndCapabilitiesReply,'CapabilitiesRequestAndCapabilitiesReply',\
    60.   GetMonitorTechnologyType,'GetMonitorTechnologyType',\
    61.   SetVCPFeature,'SetVCPFeature'
    62.                                          
    А вот уже готовая программа:
     

    Вложения:

    • TestMonitor.zip
      Размер файла:
      1,7 КБ
      Просмотров:
      6