请教各路高手:有一事请教:我想用API改变屏幕的分辨率,在书上我也找到了例子,用到了几个函数,其中有一个api函数:lstrcpy,它的两个参数在书上是声明是any类型,而我用vb的api浏览器找到的声明却是string型,最关键的是在执行时系统提示“类型不符”(不论用什么类型声明),我用了lstrcpy传递的参数的类型是DEVMODE型,一个自定义记录类型,请教各位如何解决,用这个方法行,换一种方法也行,只要能在vb里改变系统的分辨率就行!!!!多谢!!!

解决方案 »

  1.   

    lstrcpy ByVal str1,ByVal str2
    两个参数都是字符串
    传递自定义类型的数据建议用RtlMoveMemory,声明如下:
    Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any,lpvSource As Any,ByVal cbCopy as Long)
    注意这个过程在Api浏览器中没有定义,你可以自己加入进去
      

  2.   

    Private 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
    Public 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
    -----------------------------------------------------
    调用
    Call ChangeRes(800, 600, 32, 75) '75是刷新率
      

  3.   

    Option ExplicitPrivate Declare Function EnumDisplaySettings Lib "user32" Alias _
       "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, _
       ByVal iModeNum As Long, lpDevMode As Any) As LongPrivate 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 LongConst EWX_REBOOT = 2          ’ 重开机
    Const CCDEVICENAME = 32
    Const CCFORMNAME = 32
    Const DM_PELSWIDTH = &H80000
    Const DM_PELSHEIGHT = &H100000Const DISP_CHANGE_SUCCESSFUL = 0
    Const DISP_CHANGE_RESTART = 1
    Const CDS_UPDATEREGISTRY = 1Private 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 DevM As DEVMODEPrivate Sub SetDisplayMode(LngWidth As Long, LngHeight As Long)
        Dim i As Long
        Dim b As Long
        Dim ans As Long
        Dim a As Long
        Exit Sub
        a = EnumDisplaySettings(0, 0, DevM) ’Initial Setting
        DevM.dmDisplayFrequency = 85
        DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
        DevM.dmPelsWidth = LngWidth   ’设定成想要的分辨率
        DevM.dmPelsHeight = LngHeight
        b = ChangeDisplaySettings(DevM, 1) ’Changed Only this time
    End SubPublic Sub SetRunDisplayMode()
        SaveSetting App.EXEName, "屏幕设置", "Width", Screen.width \ Screen.TwipsPerPixelX
        SaveSetting App.EXEName, "屏幕设置", "Height", Screen.Height \ Screen.TwipsPerPixelY
        SetDisplayMode 800, 600
    End SubPublic Sub RestoreDisplayMode()
    Dim SWidth As Long
    Dim SHeight As Long
        SWidth = GetSetting(App.EXEName, "屏幕设置", "Width", 800)
        SHeight = GetSetting(App.EXEName, "屏幕设置", "height", 600)
        DeleteSetting App.EXEName, "屏幕设置"
        SetDisplayMode SWidth, SHeight
    End Sub