我不是高手,不过你的这个问题我可以解决。
==================================================Option ExplicitPrivate 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 LongPrivate 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 TypeConst DM_BITSPERPEL = &H40000
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const DM_DISPLAYFREQUENCY = &H400000
Private Sub ChangeRes(lngPelsWidth As Long, _
                      lngPelsHeight As Long, _
                      intBitsPerPel As Integer, _
                      lngDisplayFrequency As Long)
    Dim dm As DEVMODE
    
    Call EnumDisplaySettings(0&, -1, dm)
    
    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 Sub
Private Sub Command1_Click()
    Call ChangeRes(800, 600, 32, 75) '75为刷新率
End Sub

解决方案 »

  1.   

    请教 junwhj一个问题,你的程序我试过了,it's ok但是在VB定义的DEVMODE
    结构怎么跟VC的不一样:VB的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         //不同点Integer = 2Bytes
        dmPelsWidth As Long
        dmPelsHeight As Long
        dmDisplayFlags As Long
        dmDisplayFrequency As Long
    因为VB使用Unicode所以等同于VC的DEVMODEW结构,VC的DEVMODEW结构的定义:
        WCHAR  dmDeviceName[CCHDEVICENAME];
        WORD dmSpecVersion;
        WORD dmDriverVersion;
        WORD dmSize;
        WORD dmDriverExtra;
        DWORD dmFields;
        union {
          struct {
            short dmOrientation;
            short dmPaperSize;
            short dmPaperLength;
            short dmPaperWidth;
          };
          POINTL dmPosition;
        };
        short dmScale;
        short dmCopies;
        short dmDefaultSource;
        short dmPrintQuality;
        short dmColor;
        short dmDuplex;
        short dmYResolution;
        short dmTTOption;
        short dmCollate;
        WCHAR  dmFormName[CCHFORMNAME];
        WORD   dmLogPixels;
        DWORD  dmBitsPerPel;              //不同点DWORD = 4Bytes
        DWORD  dmPelsWidth;
        DWORD  dmPelsHeight;
        DWORD  dmDisplayFlags;
        DWORD  dmDisplayFrequency;
    为什么?
      

  2.   

    我测试了一下,VC的DEVMODE结构大小是124字节,而VB的DEVMODE 结构只有122字节,少了2字节,显示是声明的错误.
    试试用VC的声明吧.dmBitsPerpel As Long
    反正两者必有一个是错误的.