怎样用API函数实现更改屏幕分辨率,急需函数。(最好有详细代码!)

解决方案 »

  1.   

    Private Declare Function ChangeDisplaySettings Lib "user32" Alias_ "ChangeDisplaySettingsA" (ByVal lpDevMode As Long, ByVal dwflags As Long) As Long 第一个参数指向一个DEVMODE结构,第二个参数为一些标志,这些标志有: 
    标志含义 

    当前屏幕的图形模式将被动态地改变 
    CDS_UPDATEREGISTRY 
    当前屏幕的图形模式将被动态地改变并且注册表里的屏幕分辨率的值也被更新 
    (注册表中保存有屏幕的分辨率及相关属性 ,以便以后开机或重起时加载), 
    在USER文件中也保存该模式 CDS_TEST 仅供系统测试,看这种图形模式是否能够正常 CDS_FULLSCREEN 临时改变 
    Windows NT: 
    如果切换到另外的桌面,该模式不会被保存 CDS_GLOBAL 
    该设置将被保存在全局设置区内,对所有用户都起作用 CDS_SET_PRIMARY 
    设置该设备为私有设备,这里对屏幕对象不起作用 CDS_RESET 恢复以前的设置 
      

  2.   

    声明: 
    Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As _ 
    Any, lpString2 As Any) As Long Private Declare Function ChangeDisplaySettings Lib "user32" Alias _ 
    "ChangeDisplaySettingsA" (ByVal lpDevMode As Long, ByVal dwflags As Long) As Long Private Const CCHDEVICENAME = 32 
    Private Const CCHFORMNAME = 32 Private Type DEVMODE’详细参考MSDN 
    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 Integer 
    dmPelsWidth As Long 
    dmPelsHeight As Long 
    dmDisplayFlags As Long 
    dmDisplayFrequency As Long 
    End Type Public Function SetScreen (Width As Integer, Height As Integer, Optional Color 
    As Integer = 16) As Long'这里的16指的是真16色 
    Const DM_PELSWIDTH = &H80000 
    Const DM_PELSHEIGHT = &H100000 
    Const DM_BITSPERPEL = &H40000 
    Dim NewDevMode As DEVMODE 
    Dim pDevmode As Long With NewDevMode 
    .dmSize = Len(NewDevMode)'一般为122 
    If Color = -1 Then 
    .dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT 
    Else 
    .dmFields = DM_PELSWIDTH Or 
    DM_PELSHEIGHT Or DM_BITSPERPEL 
    End If 
    .dmPelsWidth = Width 
    .dmPelsHeight = Height 
    If Color < > -1 Then 
    .dmBitsPerPel = Color 
    End If 
    End With pDevmode = lstrcpy(NewDevMode, NewDevMode) 
    SetDisplayMode = ChangeDisplaySettings(pDevmode, 0) 
    End Function 
    Private Sub Change_Click() 
    SetScreen Val(Text1), Val(Text2), Val(Text3) 
    End Sub ’下面三个文本框分别存放分辨率和颜色值 
    Private Sub Text1_GotFocus() 
    Text1.SelStart = 0 
    Text1.SelLength = Len(Text1) 
    End Sub Private Sub Text2_GotFocus() 
    Text2.SelStart = 0 
    Text2.SelLength = Len(Text1) 
    End Sub Private Sub Text3_GotFocus() 
    Text3.SelStart = 0 
    Text3.SelLength = Len(Text1) 
    End Sub 
      

  3.   

    另一种方法:
    调整分辩率和取当前分辩率 
    怎样得到当前的屏幕分辨率? 在程序设计中我们经常要改变窗体的大小,而这也依赖于屏幕的分辨率,下面的例子将演示如何得到当前屏幕的分辨率: ResWidth = Screen.Width Screen.TwipsPerPixelX ResHeight = Screen.Height Screen.TwipsPerPixelY ScreenRes = ResWidth & "x" & ResHeight ResWidth和ResHeight分别表示屏幕的宽和高,比如这样的结果: 800x600 
    -------------------------------------------------------------------------------- 如何改变屏幕的分辨率?   对于很多VB程序员来说怎样改变屏幕的分辨率一直是一个难题,而且在API-Viewer里竟然没有EnumDisplaySettings和ChangeDisplaySettings!!遵从以下的步骤,你就可以改变屏幕的分辨率。将以下代码加入模块文件:   Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" _ (ByVal lpszDeviceName As Long, ByVal iModeNum As Long,lpDevMode As Any) As Boolean Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" _ (lpDevMode As Any, ByVal dwFlags As Long) As Long   Declare Function ExitWindowsEx Lib "user32" _ (ByVal uFlags As Long, ByVal dwReserved As Long) As Long 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 Type   2、下面的例子将演示如何把屏幕分辨率更改为640x480(保持原来的颜色数)。   Dim DevM As DEVMODE 'DevM收集信息 erg& = EnumDisplaySettings(0&, 0&, DevM) '不改变颜色数目是因为如果改变颜色数就要重新启动   DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT 'Or DM_BITSPERPEL DevM.dmPelsWidth = 640 '屏幕宽度 DevM.dmPelsHeight = 480 '屏幕高度 'DevM.dmBitsPerPel = 32 (还可以为 8, 16, 32甚至4) '改变显示模式并检查是否可能 erg& = ChangeDisplaySettings(DevM, CDS_TEST)'检查是否成功 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 End Sub