ChangeScreenResolution

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 15 дек 2024.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    785
    Немного потыкался что-то никак и мало что понятно.
    Хочется просто вбить 1920x1080 и применить.
    У manhunter подсмотрел структуру на Fasm, оттуда и забрал.
    Непонятно как Device Name получить или что там хендл?
     
  2. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    106
    Использовать EnumDisplayDevices, которая возвращает в буфер структыры DISPLAY_DEVICE это самое DeviceName как строку не более 32 символов
     
    Semiono нравится это.
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    785
    Код (Text):
    1. ;---------------------------------------------
    2. ; Monitor Add/Remove Demo
    3. ; Copyright (C) ManHunter / PCL
    4. ; http://www.manhunter.ru
    5. ;---------------------------------------------
    6.  
    7. format PE GUI 4.0
    8. entry start
    9.  
    10. include '%fasm%/win32a.inc'
    11.  
    12. struct  DISPLAY_DEVICE
    13.         cb           dd ?
    14.         DeviceName   rb 32
    15.         DeviceString rb 128
    16.         StateFlags   dd ?
    17.         DeviceID     rb 128
    18.         DeviceKey    rb 128
    19. ends
    20.  
    21. struct DEVMODE
    22.         dmDeviceName    rb 32
    23.         dmSpecVersion   dw ?
    24.         dmDriverVersion dw ?
    25.         dmSize          dw ?
    26.         dmDriverExtra   dw ?
    27.         dmFields        dd ?
    28.         dmPosition      POINT ?
    29.         dmDisplayOrientation dd ?
    30.         dmDisplayFixedOutput dd ?
    31.         dmColor         dw ?
    32.         dmDuplex        dw ?
    33.         dmYResolution   dw ?
    34.         dmTTOption      dw ?
    35.         dmCollate       dw ?
    36.         dmFormName      rb 32
    37.         dmLogPixels     dw ?
    38.         dmBitsPerPel    dd ?
    39.         dmPelsWidth     dd ?
    40.         dmPelsHeight    dd ?
    41.         dmDisplayFlags  dd ?
    42.         dmNup           dd ?
    43.         dmDisplayFrequency dd ?
    44.         dmICMMethod     dd ?
    45.         dmICMIntent     dd ?
    46.         dmMediaType     dd ?
    47.         dmDitherType    dd ?
    48.         dmReserved1     dd ?
    49.         dmReserved2     dd ?
    50.         dmPanningWidth  dd ?
    51.         dmPanningHeight dd ?
    52. ends
    53.  
    54. EDD_GET_DEVICE_INTERFACE_NAME = 1
    55. ENUM_REGISTRY_SETTINGS        = 0FFFFFFFEh
    56.  
    57. CDS_UPDATEREGISTRY      = 1
    58. CDS_NORESET             = 10000000h
    59.  
    60. DM_PELSWIDTH            = 1024;00080000h
    61. DM_PELSHEIGHT           = 768;00100000h
    62. DM_POSITION             = 00000020h
    63.  
    64. ;---------------------------------------------
    65.  
    66. section '.data' data readable writeable
    67.  
    68. dds   DISPLAY_DEVICE
    69. dmode DEVMODE
    70.  
    71. device dd ?
    72.  
    73. section '.code' code readable executable
    74.  
    75. start:
    76.         ; Âòîðîé ìîíèòîð
    77.         mov     [device],0
    78.  
    79.         ; Îòêëþ÷èòü ìîíèòîð
    80. ;        mov     [dds.cb],sizeof.DISPLAY_DEVICE
    81. ;        invoke  EnumDisplayDevices,NULL,[device],dds,\
    82. ;                EDD_GET_DEVICE_INTERFACE_NAME
    83. ;        invoke  RtlZeroMemory,dmode,sizeof.DEVMODE
    84. ;        mov     [dmode.dmSize],sizeof.DEVMODE
    85. ;        mov     [dmode.dmFields],DM_PELSHEIGHT+DM_PELSWIDTH+DM_POSITION
    86. ;        invoke  ChangeDisplaySettingsEx,dds.DeviceName,dmode,0,\
    87. ;                CDS_UPDATEREGISTRY+CDS_NORESET,NULL
    88. ;        invoke  ChangeDisplaySettingsEx,NULL,NULL,0,0,NULL
    89.  
    90.         ; Ïàóçà 10 ñåêóíä
    91. ;        invoke  Sleep,10000
    92.  
    93.         ; Ïîäêëþ÷èòü ìîíèòîð
    94.         mov     [dds.cb],sizeof.DISPLAY_DEVICE
    95.         invoke  EnumDisplayDevices,NULL,[device],dds,\
    96.                 EDD_GET_DEVICE_INTERFACE_NAME
    97.         mov     [dmode.dmSize],sizeof.DEVMODE
    98.         invoke  EnumDisplaySettings,dds.DeviceName,\
    99.                 ENUM_REGISTRY_SETTINGS,dmode
    100.         mov     [dmode.dmFields],DM_PELSHEIGHT+DM_PELSWIDTH;+DM_POSITION
    101.         invoke  ChangeDisplaySettingsEx,dds.DeviceName,dmode,0,\
    102.                 CDS_UPDATEREGISTRY,NULL;+CDS_NORESET,NULL
    103.         invoke  ChangeDisplaySettingsEx,NULL,NULL,0,0,NULL
    104.  
    105.         invoke  ExitProcess,0
    106.  
    107. ;---------------------------------------------
    108.  
    109. section '.idata' import data readable writeable
    110.  
    111. library kernel32,'kernel32.dll',\
    112.         user32,'user32.dll',\
    113.         user33,'user32.dll'
    114.  
    115. include '%fasm%/api/kernel32.inc'
    116. include '%fasm%/api/user32.inc'
    117.  
    118. ;import user33,\
    119. ;        EnumDisplayDevices,'EnumDisplayDevicesA'
    120.  
    Чё-то дёргается (реагирует) но не изменяется. А зачем два раза подряд ChangeDisplaySettingsEx?
    --- Сообщение объединено, 16 дек 2024 в 15:48 ---
    О! Пошло дело! )) Я изначально вбивал
    Код (Text):
    1.         mov [dmode.dmPelsWidth],1024
    2.         mov [dmode.dmPelsHeight],768
    а вот [dmode.dmFields] мне не понятно было, в чём смысл этого параметра?
     
  4. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    106
    Выбор полей в структуре, на которые функция будет реагировать, а какие она игнорирует.
     
    Semiono нравится это.
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    785
    Афигеть, как просто Wallpaper поменять, впрочем это не нужно теперь. (Я хочу просто во время установки Windows ширину выставить)
    Код (Text):
    1.         invoke SystemParametersInfo,SPI_SETDESKWALLPAPER,NULL,'C:\Windows\exec.png',SPIF_UPDATEINIFILE
    Но режим экрана обои сбрасывает, разумеется.
    --- Сообщение объединено, 16 дек 2024 в 16:24 ---
    А нельзя дисплей сломать? Я думаю Ширина x Высота это безопасно? Тем более стандарт практически.
     
  6. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    106
    Для этого у ChangeDisplaySettings/ChangeDisplaySettingsEx есть флаг CDS_TEST. Он позволяет узнать, что изменения вообще возможны
     
    Semiono нравится это.