关于VB用API改变分辨率问题,改I改变分辨率问题倒是没有问题,问题是在XP中只要改变的话刷新率就跟着改成默认的60MHZ了,请问题用API能不能实现更变分辨率的同时也能更改刷新率呀?

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/2705/2705267.xml?temp=.8693964
      

  2.   

    引用:rainstormmaster大哥的,怎样求某一屏幕分辨率下的最大刷新率?
    Private Const DM_DISPLAYFREQUENCY = &H400000
    并将DEVMODE的dmFields指定为:
    DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL Or DM_DISPLAYFREQUENCY
    下面是修改后的程序:
    Option ExplicitPrivate Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As DEVMODE) As Long
    Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As DEVMODE, ByVal dwFlags As Long) As Long
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As LongPrivate Const EWX_LOGOFF = 0
    Private Const EWX_SHUTDOWN = 1
    Private Const EWX_REBOOT = 2
    Private Const EWX_FORCE = 4
    Private Const CCHDEVICENAME = 32
    Private Const CCHFORMNAME = 32
    Private Const DM_BITSPERPEL = &H40000
    Private Const DM_PELSWIDTH = &H80000
    Private Const DM_PELSHEIGHT = &H100000
    Private Const DM_DISPLAYFREQUENCY = &H400000Private Const CDS_UPDATEREGISTRY = &H1
    Private Const CDS_TEST = &H4
    Private Const DISP_CHANGE_SUCCESSFUL = 0
    Private Const DISP_CHANGE_RESTART = 1
    Private Const ENUM_CURRENT_SETTINGS = -1
    Private Const ENUM_REGISTRY_SETTINGS = -2Private Type DEVMODE
        dmDeviceName As String * CCHDEVICENAME
        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 * CCHFORMNAME
        dmUnusedPadding As Integer
        dmBitsPerPel As Long
        dmPelsWidth As Long
        dmPelsHeight As Long
        dmDisplayFlags As Long
        dmDisplayFrequency As Long
    End Type' Return the caption for this device mode information.
    Private Function DevModeCaption(dev_mode As DEVMODE) As String
            DevModeCaption = _
            Format$(dev_mode.dmPelsWidth) & " x " & _
            Format$(dev_mode.dmPelsHeight) & " (" & _
            Format$(dev_mode.dmBitsPerPel) & ") " & _
            ", Freq: " & _
            Format$(dev_mode.dmDisplayFrequency) & _
            " Flags: " & _
            Format$(dev_mode.dmDisplayFlags)
    End Function
    ' Select the indicated mode.
    Private Sub cmdSetMode_Click()
        Dim dev_mode As DEVMODE
        Dim mode_num As Long    ' Refetch information about this mode.
        mode_num = cboMode.ItemData(cboMode.ListIndex)
        If EnumDisplaySettings(ByVal vbNullString, _
            mode_num, dev_mode) = 0 _
        Then
            MsgBox "Error refetching mode data."
            Exit Sub
        End If    ' Confirm.
        If MsgBox("Do you want to select the mode " & _
            DevModeCaption(dev_mode), vbYesNo) = vbNo _
                Then Exit Sub    ' Select the mode.
        dev_mode.dmFields = _
            DM_PELSWIDTH Or _
            DM_PELSHEIGHT Or _
            DM_BITSPERPEL Or _
            DM_DISPLAYFREQUENCY
            
        dev_mode.dmSize = Len(dev_mode)
        dev_mode.dmDriverExtra = 0    ' Test the change.
        Select Case ChangeDisplaySettings(dev_mode, CDS_TEST)
            Case DISP_CHANGE_RESTART
                If MsgBox("The system must reboot to make this change. Do you want to reboot?", _
                    vbYesNo) = vbYes _
                Then
                    If ChangeDisplaySettings(dev_mode, CDS_UPDATEREGISTRY) _
                        <> DISP_CHANGE_SUCCESSFUL _
                    Then
                        MsgBox "Error setting the new mode."
                    Else
                        ExitWindowsEx EWX_REBOOT, 0
                    End If
                End If        Case DISP_CHANGE_SUCCESSFUL
                If ChangeDisplaySettings(dev_mode, CDS_UPDATEREGISTRY) _
                    = DISP_CHANGE_SUCCESSFUL _
                Then
                    MsgBox "Mode changed."
                Else
                    MsgBox "Error setting the new mode."
                End If
            Case Else
                MsgBox "Error setting the new mode."
        End Select
    End Sub
    ' Load the available device modes.
    Private Sub Form_Load()
        cmdSetMode.Caption = "设置显示模式"
        Dim dev_mode As DEVMODE
        Dim mode_num As Long
        
            ' Get the available modes.
            mode_num = 0
            Do
                ' Stop when the function fails.
                If EnumDisplaySettings(ByVal vbNullString, _
                    mode_num, dev_mode) = 0 _
                        Then Exit Do
        
                ' Add this choice to the ComboBox.
                cboMode.AddItem DevModeCaption(dev_mode)
                cboMode.ItemData(cboMode.NewIndex) = mode_num
        
                mode_num = mode_num + 1
            Loop
        
            ' Make sure we got some modes.
            If mode_num = 0 Then
                MsgBox "EnumDisplaySettings returned no display modes."
                Exit Sub
            End If
        
            ' Get the current mode.
            If EnumDisplaySettings(ByVal vbNullString, _
                ENUM_CURRENT_SETTINGS, dev_mode) = 0 _
            Then
                MsgBox "Unable to get the current mode."
                Exit Sub
            End If
        
            ' Select the current mode.
            cboMode.Text = DevModeCaption(dev_mode)
    End Sub