请教高手如何用VB在WINDOWS2000/XP下设置分辨率,我试过ChangedisplaySettingsEx(),可是找不到声明,哪位高手指点一下!!

解决方案 »

  1.   

    'Example Name:ChangeDisplaySettingsEx
    Const CCDEVICENAME = 32
    Const CCFORMNAME = 32
    Const DM_PELSWIDTH = &H80000
    Const DM_PELSHEIGHT = &H100000
    Const CDS_TEST = &H4
    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
        dmICMMethod As Long 'NT 4.0
        dmICMIntent As Long 'NT 4.0
        dmMediaType As Long 'NT 4.0
        dmDitherType As Long 'NT 4.0
        dmReserved1 As Long 'NT 4.0
        dmReserved2 As Long 'NT 4.0
        dmPanningWidth As Long 'Win2000
        dmPanningHeight As Long 'Win2000
    End Type
    Private Declare Function ChangeDisplaySettingsEx Lib "user32" Alias "ChangeDisplaySettingsExA" (lpszDeviceName As Any, lpDevMode As Any, ByVal hWnd As Long, ByVal dwFlags As Long, lParam As Any) As Long
    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
    Dim OldX As Long, OldY As Long, T As Long
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim DD As DISPLAY_DEVICE, DevM As DEVMODE
        DD.cb = Len(DD)
        OldX = Screen.Width / Screen.TwipsPerPixelX
        OldY = Screen.Height / Screen.TwipsPerPixelY
        'First retieve some display info
        If EnumDisplayDevices(ByVal 0&, 0, DD, ByVal 0&) Then
            'and show it
            Me.AutoRedraw = True
            Me.Print "Device String:" + Left$(DD.DeviceString, InStr(1, DD.DeviceString, Chr$(0)) - 1)
            Me.Print "Device Name:" + Left$(DD.DeviceName, InStr(1, DD.DeviceName, Chr$(0)) - 1)
            Me.Print "Device Key:" + Left$(DD.DeviceKey, InStr(1, DD.DeviceKey, Chr$(0)) - 1)
            Me.Print "Device ID:" + Left$(DD.DeviceID, InStr(1, DD.DeviceID, Chr$(0)) - 1)
        Else
            Me.Print "Error while retrieving Display Information"
        End If
        DevM.dmSize = Len(DevM)
        'we want to change the horizontal and the vertical resolution
        DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
        DevM.dmPelsWidth = 640
        DevM.dmPelsHeight = 480
        'change the display settings
        Call ChangeDisplaySettingsEx(ByVal 0&, DevM, ByVal 0&, CDS_TEST, ByVal 0&)
        T = Timer
        Do: DoEvents: Loop Until Timer > T + 5
        DevM.dmPelsWidth = OldX
        DevM.dmPelsHeight = OldY
        'change the display settings back to the old settings
        Call ChangeDisplaySettingsEx(ByVal 0&, DevM, ByVal 0&, CDS_TEST, ByVal 0&)
    End Sub
      

  2.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=201510
      

  3.   

    MOd:
    Public Declare Function EnumDisplaySettings _
        Lib "user32" Alias "EnumDisplaySettingsA" ( _
        ByVal lpszDeviceName As Long, _
        ByVal iModeNum As Long, _
        lpDevMode As Any) As Boolean
        
    Public Declare Function ChangeDisplaySettings _
        Lib "user32" Alias "ChangeDisplaySettingsA" ( _
        lpDevMode As Any, _
        ByVal dwflags As Long) As LongPublic Type DEVMODE
        dmDeviceName As String * 32
        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 * 32
        dmUnusedPadding As Integer
        dmBitsPerPel As Integer
        dmPelsWidth As Long
        dmPelsHeight As Long
        dmDisplayFlags As Long
        dmDisplayFrequency As Long
    End TypePublic Const DM_BITSPERPEL = &H40000
    Public Const DM_PELSWIDTH = &H80000
    Public Const DM_PELSHEIGHT = &H100000
    Public Const DM_DISPLAYFREQUENCY = &H400000'关键在于dm.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL Or DM_DISPLAYFREQUENCY
    '加上DM_DISPLAYFREQUENCY后才会改变刷新频率
    Public Sub ChangeRes(lngPelsWidth As Long, _
                          lngPelsHeight As Long, _
                          intBitsPerPel As Integer, _
                          lngDisplayFrequency As Long)
        Dim dm As DEVMODE
        
        Call EnumDisplaySettings(0&, -1, dm)
        Debug.Print "刷新频率:" & dm.dmDisplayFrequency
        
        dm.dmFields = DM_PELSWIDTH Or _
                      DM_PELSHEIGHT Or _
                      DM_BITSPERPEL Or _
                      DM_DISPLAYFREQUENCY
        dm.dmPelsWidth = lngPelsWidth
        dm.dmPelsHeight = lngPelsHeight
        dm.dmBitsPerPel = intBitsPerPel
        dm.dmDisplayFrequency = lngDisplayFrequency
        
        Call ChangeDisplaySettings(dm, 1)
    End SubPublic Function GetSysDisplay()End Function
    //****************************************
    Form1:
    List1、Command1
    code:Option Explicit
    Dim devM() As DEVMODE
    Private Sub Command1_Click()
     Call ChangeRes(1024, 768, 32, 85)
    End Sub
    Private Sub Form_Load()
       Dim HasMore As Long, i As Integer
       Dim MaxBits As Integer
       MaxBits = 0
       i = 0
        Do
            ReDim Preserve devM(0 To i)
            HasMore = EnumDisplaySettings(0, i, devM(i))
            If HasMore = 0 Then Exit Do
            
            If devM(i).dmBitsPerPel > MaxBits Then MaxBits = devM(i).dmBitsPerPel
            Debug.Print devM(i).dmBitsPerPel
            
            i = i + 1
        Loop
       
        Debug.Print "最大" & MaxBits
    End Sub
      

  4.   

    我贴在VB6+win200 professional 下通过
    通过的话分全给我吧
      

  5.   

    Public Const EWX_LOGOFF = 0
    Public Const EWX_SHUTDOWN = 1
    Public Const EWX_REBOOT = 2
    Public Const EWX_FORCE = 4
    Public Const CCDEVICENAME = 32
    Public Const CCFORMNAME = 32
    Public Const DM_BITSPERPEL = &H40000
    Public Const DM_PELSWIDTH = &H80000
    Public Const DM_PELSHEIGHT = &H100000
    Public Const CDS_UPDATEREGISTRY = &H1
    Public Const CDS_TEST = &H4
    Public Const DISP_CHANGE_SUCCESSFUL = 0
    Public Const DISP_CHANGE_RESTART = 1
    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 TypePrivate Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
    Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As LongPublic Sub ChangeScreenDisplay(LngDmWidth As Long, LndDmHeight As Long)
    On Error GoTo ErrHandle
    Dim DevM As DEVMODE '将取得的讯息存放在 DevM
    Dim erg&, an&
       erg& = EnumDisplaySettings(0&, 0&, DevM)
        
        DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT 'Or DM_BITSPERPEL
        DevM.dmPelsWidth = LngDmWidth '想要设定的屏幕宽度
        DevM.dmPelsHeight = LndDmHeight '想要设定的屏幕高度
    '我们不更改色板,因为一旦更改色板就必须重新开机!
    'DevM.dmBitsPerPel = 32 (could be 8, 16, 32 or even 4) '此行可用于改变色板'以下这行指令会暂时更改屏幕的分辨率,是测试性的,不一定成功,
    '不过因为没将设定值写到注册表,所以虽然可能更改成功,
    '但是一旦重新开机后,会自动恢复成更改前的设定值
    erg& = ChangeDisplaySettings(DevM, CDS_TEST)'上面的指令若成功,而且您想永久性的更改使用者的屏幕分辨率,
    '您还必须使用下一行指令,将资料写到注册表
    'erg& = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
    '但是如果您只是想暂时更改使用者的屏幕分辨率,就不需要了.'当然并不是您随便设定一个值,就一定会成功的更改屏幕分辨率,
    '所以还需要检查是否更改成功!下面的程序就是检查是否更改成功
    Select Case erg&
        Case DISP_CHANGE_RESTART
            '通常如果有更改到色板,或者较老的板子,会要求重新开机
            an& = Msgbox("您必须重新开机!", vbYesNo + vbSystemModal, "讯息")
            If an& = vbYes Then
                erg& = ExitWindowsEx(EWX_REBOOT, 0&)
            End If
        Case DISP_CHANGE_SUCCESSFUL
        '如果更改成功且不需重新开机,您就可以将设定值写到注册表中
            erg& = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
            Msgbox "分辨率更改成功!", vbOKOnly + vbSystemModal, "成功!"
        Case Else
        '更改不成功
            Msgbox "不支持此一模式!", vbOKOnly + vbSystemModal, "错误!"
    End Select
    Exit Sub
    ErrHandle:
        Msgbox Err.Description
    End Sub
     2000 Server  下测试通过