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

Discussion in 'WASM.WIN32' started by hapr, Jun 5, 2018.

  1. hapr

    hapr Member

    Blog Posts:
    0
    Joined:
    Mar 9, 2009
    Messages:
    59
    Всем добрый вечер!
    Собственно недавно заинтересовался как выключить и включить монитор. Вроде бы разобрался, но тут возникло одно НО. По факту все сейчас современные мониторы поддерживают 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

    Blog Posts:
    0
    Joined:
    Mar 9, 2009
    Messages:
    59
    Может кто не против проверить? Как себя поведёт VCP code D6h с 1 и 4, само собой если только у вас монитор отличный от Samsung.
    Вот код:
    Code (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.                                          
    А вот уже готовая программа:
     

    Attached Files:

  3. asmlamo

    asmlamo Well-Known Member

    Blog Posts:
    0
    Joined:
    May 18, 2004
    Messages:
    1,742
    Проверил. Гасит монитор и включает его.
    Монитор Филипс.
     
  4. DeGlucker2

    DeGlucker2 New Member

    Blog Posts:
    0
    Joined:
    Jan 23, 2017
    Messages:
    8
    BENQ не работает
     
  5. al79

    al79 Алексей

    Blog Posts:
    0
    Joined:
    May 11, 2006
    Messages:
    133
    Location:
    Екатеринбург
    HP ZR30w Гасит монитор и включает его.
     
  6. Jin X

    Jin X Active Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2009
    Messages:
    369
    Location:
    Кольца Сатурна
    Acer, не пашет.
    Монитору лет 7.