ChangeDisplaySettings는 현재 디스플레이 장치의 해상도를 변경한다.

● 선언
Function ChangeDisplaySettings Lib "User32" Alias "ChangeDisplaySettingsA" (ByVal lpDevMode As Long, ByVal dwflags As Long) As Long

● 인수

lpDevMode ━ 변경하고자 하는 정보가 저장된 구조체, DEVMODE 구조 사용, 아래 표와 같은 상수를 dmFields에 지정할 수 있다
dwflags ━ 그래픽 모드의 변경 방법

다은은 소스의 폼 이미지이다.


바꾸고 싶은 해상도 모드에서 더블 클릭하면 지정행의 해상도 모드로 변경된다
원래대로 버튼은 초기 이미지로 변경한다

다음은 소스이다
Option Explicit

Private Declare Function EnumDisplayDevices Lib "user32" Alias "EnumDisplayDevicesA" (Unused As Any, ByVal iDevNum As Long, lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As Long) As Boolean
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As DEVMODE) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Const CCDEVICENAME = 32
Private Const CCFORMNAME = 32
Private Const ENUM_CURRENT_SETTINGS = -1
Private Const DISPLAY_DEVICE_ACTIVE As Long = &H1
Private Type DISPLAY_DEVICE
    cb           As Long
    DeviceName   As String * 32
    DeviceString As String * 128
    StateFlags   As Long
    DeviceID     As String * 128
    DeviceKey    As String * 128
End Type
Private Type DEVMODE
    dmDeviceName    As String * CCDEVICENAME
    dmSpecVersion   As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type

Private DisplayDeviceInfo As DISPLAY_DEVICE ' 디스플레이 다바이스 정보 구조체
Private CurrentDisplayInfo As DEVMODE ' 초기 디스플레이 설정 정보 구조체
   
Private Sub Command1_Click() ' 원래대로
    ChangeDisplaySettings CurrentDisplayInfo, 0
End Sub

Private Sub Form_Load()
    Dim DisplayInfo As DEVMODE ' 디스플레이 설정 정보 구조체
    Dim DNum As Long ' 디바이스 인덱스 번호, 디스플레이 모드 인덱스 번호
    Dim Ret As Long ' 반환값
   
    Me.AutoRedraw = True
    mfgMode.SelectionMode = flexSelectionByRow
    Ret = -1 ' 활성중인 디스플레이 장치의 정보를 얻는다.
    DNum = 0
    DisplayDeviceInfo.cb = Len(DisplayDeviceInfo)
    Do
        If Not Ret = -1 Then
            If (DisplayDeviceInfo.StateFlags And DISPLAY_DEVICE_ACTIVE) = DISPLAY_DEVICE_ACTIVE Then
                Exit Do
            End If
            DNum = DNum + 1
        End If
        DisplayDeviceInfo.cb = Len(DisplayDeviceInfo)
        Ret = EnumDisplayDevices(ByVal 0&, DNum, DisplayDeviceInfo, ByVal 0&)
    Loop While Not Ret = 0
   
    Ret = -1 ' 활성중인 디스플레이 장치에 대한 디스플레이 모드를 구한다.
    DNum = 0
    With mfgMode
        .Rows = 2
        .Cols = 5
        .FixedCols = 0
        .FixedRows = 1
       
        .Row = 0
        .Col = 0
        .FixedAlignment(.Col) = flexAlignCenterCenter
        .ColAlignment(.Col) = flexAlignCenterCenter
        .Text = "모드 인덱스 번호"
        .ColWidth(.Col) = Me.TextWidth(.Text) + 100
        .Col = 1
        .FixedAlignment(.Col) = flexAlignCenterCenter
        .ColAlignment(.Col) = flexAlignCenterCenter
        .Text = "수평 해상도"
        .ColWidth(.Col) = Me.TextWidth(.Text) + 100
        .Col = 2
        .FixedAlignment(.Col) = flexAlignCenterCenter
        .ColAlignment(.Col) = flexAlignCenterCenter
        .Text = "수직 해상도"
        .ColWidth(.Col) = Me.TextWidth(.Text) + 100
        .Col = 3
        .FixedAlignment(.Col) = flexAlignCenterCenter
        .ColAlignment(.Col) = flexAlignCenterCenter
        .Text = "색상 비트수"
        .ColWidth(.Col) = Me.TextWidth(.Text) + 100
        .Col = 4
        .FixedAlignment(.Col) = flexAlignCenterCenter
        .ColAlignment(.Col) = flexAlignCenterCenter
        .Text = "모니터 재생율"
        .ColWidth(.Col) = Me.TextWidth(.Text) + 100
        Do
            If Not Ret = -1 Then
                .Rows = DNum + 2
                .Row = .Rows - 1
                .Col = 0
                .Text = DNum
                .Col = 1
                .Text = Format(DisplayInfo.dmPelsWidth, "@@@@")
                .Col = 2
                .Text = Format(DisplayInfo.dmPelsHeight, "@@@@")
                .Col = 3
                .Text = DisplayInfo.dmBitsPerPel
                .Col = 4
                .Text = DisplayInfo.dmDisplayFrequency & "Hz"
                DNum = DNum + 1
            End If
            Ret = EnumDisplaySettings(DisplayDeviceInfo.DeviceName, DNum, DisplayInfo)
        Loop While Not Ret = 0
        Ret = EnumDisplaySettings(DisplayDeviceInfo.DeviceName, ENUM_CURRENT_SETTINGS, CurrentDisplayInfo)
    End With
End Sub

Private Function GetVBStringFromAPIString(ByVal Str As String) As String ' API에서 사용한 문자열이 담겨있는 버퍼에 유용한 문자열만 취한다.
    GetVBStringFromAPIString = Left$(Str, InStr(1, Str, vbNullChar) - 1)
End Function

Private Sub mfgMode_DblClick() ' 디스플레이 설정 변경
    Dim DisplayInfo As DEVMODE ' 디스플레이 설정 정보 구조체
    Dim Ret As Long
   
    With mfgMode
        If Not .RowSel = .FixedRows - 1 Then ' 고정 행이 아닐때
            .Col = 0
            Ret = EnumDisplaySettings(DisplayDeviceInfo.DeviceName, CLng(.Text), DisplayInfo)
            Debug.Print DisplayInfo.dmPelsWidth, DisplayInfo.dmPelsHeight, DisplayInfo.dmBitsPerPel, DisplayInfo.dmDisplayFrequency
            ChangeDisplaySettings DisplayInfo, 0
        End If
    End With
End Sub

+ Recent posts