你试试 Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long Private Const CCHDEVICENAME = 32 Private Const CCHFORMNAME = 32 Private Const ENUM_CURRENT_SETTINGS = 1 Private 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 TypePrivate Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByVal lpDevMode As Long, ByVal dwflags As Long) As Long Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As Any) As Long Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As LongPrivate Const SM_CXSCREEN = 0 Private Const SM_CYSCREEN = 1Dim pNewMode As DEVMODE Dim pOldMode As Long Dim nOrgWidth As Integer, nOrgHeight As Integer
'设置显示器分辨率的执行函数 Private Function SetDisplayMode(Width As Integer, Height As Integer, Color As Integer) As Long ', Freq As Long) As Long On Error GoTo ErrorHandler Const DM_PELSWIDTH = &H80000 Const DM_PELSHEIGHT = &H100000 Const DM_BITSPERPEL = &H40000 Const DM_DISPLAYFLAGS = &H200000 Const DM_DISPLAYFREQUENCY = &H400000 With pNewMode .dmSize = Len(pNewMode) If Color = 0 Then 'Color = 0 时不更改屏幕颜色 .dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Else .dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_DISPLAYFREQUENCY '属性率的更改还是没办法,不过,不加入此DM_DISPLAYFREQUENCY这个参数,只要系统支持,应该不会更改刷新率的 End If .dmPelsWidth = Width .dmPelsHeight = Height '刷新频率为85 .dmDisplayFrequency = 85 If Color <> 0 Then .dmBitsPerPel = Color End If End With pOldMode = lstrcpy(pNewMode, pNewMode) SetDisplayMode = ChangeDisplaySettings(pOldMode, 1) Exit Function ErrorHandler: MsgBox Err.Description End FunctionPrivate Sub Command1_Click() Dim nWidth As Integer, nHeight As Integer, nColor As Integer Select Case Combo1.ListIndex Case 0 nWidth = 640: nHeight = 480: nColor = 16 '640*480*16位真彩色,256色nColor = 8,16色nColor = 4,nColor = 0 表示不改变颜色 Case 1 nWidth = 640: nHeight = 480: nColor = 24 Case 2 nWidth = 640: nHeight = 480: nColor = 32 Case 3 nWidth = 800: nHeight = 600: nColor = 16 Case 4 nWidth = 800: nHeight = 600: nColor = 24 Case 5 nWidth = 800: nHeight = 600: nColor = 32 Case 6 nWidth = 1024: nHeight = 768: nColor = 16 Case 7 nWidth = 1024: nHeight = 768: nColor = 24 Case 8 nWidth = 1024: nHeight = 768: nColor = 32 Case other nWidth = 800: nHeight = 600: nColor = 16 End Select Call SetDisplayMode(nWidth, nHeight, nColor) '注意,系统不支持的显示模式不能选,否则,准备用安全模式重启动吧.API函数EnumDisplaySettings可以选择系统支持的模式, End SubPrivate Sub Form_Load() Combo1.AddItem "640*480*16位真彩色" Combo1.AddItem "640*480*24位真彩色" Combo1.AddItem "640*480*32位真彩色" Combo1.AddItem "800*600*16位真彩色" Combo1.AddItem "800*600*24位真彩色" Combo1.AddItem "800*600*32位真彩色" Combo1.AddItem "1024*768*16位真彩色" Combo1.AddItem "1024*768*24位真彩色" Combo1.AddItem "1024*768*32位真彩色" Combo1.Text = Combo1.List(0) nOrgWidth = GetDisplayWidth nOrgHeight = GetDisplayHeight 'nOrgWidth = GetSystemMetrics(SM_CXSCREEN)'两种获取初始屏幕大小的方法均可 'nOrgHeight = GetSystemMetrics(SM_CYSCREEN) End SubPrivate Function GetDisplayWidth() As Integer GetDisplayWidth = Screen.Width \ Screen.TwipsPerPixelX End FunctionPrivate Function GetDisplayHeight() As Integer GetDisplayHeight = Screen.Height \ Screen.TwipsPerPixelY End FunctionPrivate Sub RestoreDisplayMode() Call SetDisplayMode(nOrgWidth, nOrgHeight, 0) End SubPrivate Sub Form_Unload(Cancel As Integer) RestoreDisplayMode End Sub
窗体上一个按钮(cmdSetMode)一个combobox(cboMode): Option Explicit Private 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 Long
Private 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
' 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
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Const ENUM_CURRENT_SETTINGS = 1
Private 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 TypePrivate Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByVal lpDevMode As Long, ByVal dwflags As Long) As Long
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As Any) As Long
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As LongPrivate Const SM_CXSCREEN = 0
Private Const SM_CYSCREEN = 1Dim pNewMode As DEVMODE
Dim pOldMode As Long
Dim nOrgWidth As Integer, nOrgHeight As Integer
'设置显示器分辨率的执行函数
Private Function SetDisplayMode(Width As Integer, Height As Integer, Color As Integer) As Long ', Freq As Long) As Long
On Error GoTo ErrorHandler
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const DM_BITSPERPEL = &H40000
Const DM_DISPLAYFLAGS = &H200000
Const DM_DISPLAYFREQUENCY = &H400000
With pNewMode
.dmSize = Len(pNewMode)
If Color = 0 Then 'Color = 0 时不更改屏幕颜色
.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
Else
.dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_DISPLAYFREQUENCY '属性率的更改还是没办法,不过,不加入此DM_DISPLAYFREQUENCY这个参数,只要系统支持,应该不会更改刷新率的
End If
.dmPelsWidth = Width
.dmPelsHeight = Height
'刷新频率为85
.dmDisplayFrequency = 85
If Color <> 0 Then
.dmBitsPerPel = Color
End If
End With
pOldMode = lstrcpy(pNewMode, pNewMode)
SetDisplayMode = ChangeDisplaySettings(pOldMode, 1)
Exit Function
ErrorHandler:
MsgBox Err.Description
End FunctionPrivate Sub Command1_Click()
Dim nWidth As Integer, nHeight As Integer, nColor As Integer
Select Case Combo1.ListIndex
Case 0
nWidth = 640: nHeight = 480: nColor = 16 '640*480*16位真彩色,256色nColor = 8,16色nColor = 4,nColor = 0 表示不改变颜色
Case 1
nWidth = 640: nHeight = 480: nColor = 24
Case 2
nWidth = 640: nHeight = 480: nColor = 32
Case 3
nWidth = 800: nHeight = 600: nColor = 16
Case 4
nWidth = 800: nHeight = 600: nColor = 24
Case 5
nWidth = 800: nHeight = 600: nColor = 32
Case 6
nWidth = 1024: nHeight = 768: nColor = 16
Case 7
nWidth = 1024: nHeight = 768: nColor = 24
Case 8
nWidth = 1024: nHeight = 768: nColor = 32
Case other
nWidth = 800: nHeight = 600: nColor = 16
End Select
Call SetDisplayMode(nWidth, nHeight, nColor) '注意,系统不支持的显示模式不能选,否则,准备用安全模式重启动吧.API函数EnumDisplaySettings可以选择系统支持的模式,
End SubPrivate Sub Form_Load()
Combo1.AddItem "640*480*16位真彩色"
Combo1.AddItem "640*480*24位真彩色"
Combo1.AddItem "640*480*32位真彩色"
Combo1.AddItem "800*600*16位真彩色"
Combo1.AddItem "800*600*24位真彩色"
Combo1.AddItem "800*600*32位真彩色"
Combo1.AddItem "1024*768*16位真彩色"
Combo1.AddItem "1024*768*24位真彩色"
Combo1.AddItem "1024*768*32位真彩色"
Combo1.Text = Combo1.List(0)
nOrgWidth = GetDisplayWidth
nOrgHeight = GetDisplayHeight
'nOrgWidth = GetSystemMetrics(SM_CXSCREEN)'两种获取初始屏幕大小的方法均可
'nOrgHeight = GetSystemMetrics(SM_CYSCREEN)
End SubPrivate Function GetDisplayWidth() As Integer
GetDisplayWidth = Screen.Width \ Screen.TwipsPerPixelX
End FunctionPrivate Function GetDisplayHeight() As Integer
GetDisplayHeight = Screen.Height \ Screen.TwipsPerPixelY
End FunctionPrivate Sub RestoreDisplayMode()
Call SetDisplayMode(nOrgWidth, nOrgHeight, 0)
End SubPrivate Sub Form_Unload(Cancel As Integer)
RestoreDisplayMode
End Sub
Option Explicit
Private 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 Long
Private 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 = &H400000
Private 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 = -2
Private 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