** 在 ** ** VB.NET ** ** 中改变显示器的分辩率 ** ** **
微软 MVP 李洪根
在 VB.NET 中,我们很容易获得显示器的分辩率,但是,要改变显示器的分辩率就比较麻烦了。 由于 .NET 的类库没有将 EnumDisplaySettings 和 ChangeDisplaySettings 这两个 API 函数进行封装,但是我们得调用它们函数,相对于 VB6 来说, VB.NET 调用 API 函数 是有一些小的改动!
下面,我们就尝试一下在 VB.NET 中,使用这两个 API 函数。
新建一个项目,在 Form1 上添加两个按钮,一个名为 btnGetDisp ,将其 Text 属性设置为“得到分辩率”;另一个按钮名为 btnSetDisp , Text 属性为“设置分辩率”。然后在代码窗口里添加以下代码:
Private Const CCDEVICENAME As Short = 32
Private Const CCFORMNAME As Short = 32
Private Const DM_PELSWIDTH As Integer = &H80000
Private Const DM_PELSHEIGHT As Integer = &H100000
'刷新频率常量
Private Const DM_DISPLAYFREQUENCY As Integer = &H400000
' 调用 API 函数
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" ( ByVal lpszDeviceName As Integer , ByVal iModeNum As Integer , ByRef lpDevMode As DEVMODE) As Boolean
' 调用 API 函数
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" ( ByRef lpDevMode As DEVMODE, ByVal dwflags As Integer ) As Integer
' 定义结构
Private Structure DEVMODE
1<vbfixedstring(ccdevicename), sizeconst:="CCDEVICENAME)" system.runtime.interopservices.marshalas(system.runtime.interopservices.unmanagedtype.byvaltstr,=""> Public dmDeviceName As String
2
3Dim dmSpecVersion As Short
4
5Dim dmDriverVersion As Short
6
7Dim dmSize As Short
8
9Dim dmDriverExtra As Short
10
11Dim dmFields As Integer
12
13Dim dmOrientation As Short
14
15Dim dmPaperSize As Short
16
17Dim dmPaperLength As Short
18
19Dim dmPaperWidth As Short
20
21Dim dmScale As Short
22
23Dim dmCopies As Short
24
25Dim dmDefaultSource As Short
26
27Dim dmPrintQuality As Short
28
29Dim dmColor As Short
30
31Dim dmDuplex As Short
32
33Dim dmYResolution As Short
34
35Dim dmTTOption As Short
36
37Dim dmCollate As Short
38
39<vbfixedstring(ccformname), sizeconst:="CCFORMNAME)" system.runtime.interopservices.marshalas(system.runtime.interopservices.unmanagedtype.byvaltstr,=""> Public dmFormName As String
40
41Dim dmUnusedPadding As Short
42
43Dim dmBitsPerPel As Short
44
45Dim dmPelsWidth As Integer
46
47Dim dmPelsHeight As Integer
48
49Dim dmDisplayFlags As Integer
50
51Dim dmDisplayFrequency As Integer
52
53End Structure
54
55' 改变分辩率过程,参数一宽度,参数二高度
56
57Private Sub ChangeDisp( ByRef iWidth As Single , ByRef iHeight As Single )
58
59Dim blnWorked As Boolean
60
61Dim i As Integer
62
63Dim DevM As Form1.DEVMODE
64
65i = 0
66
67Do
68
69blnWorked = EnumDisplaySettings( 0 , i, DevM)
70
71i = i + 1
72
73Loop Until (blnWorked = False )
74
75With DevM
76
77.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_DISPLAYFREQUENCY
78
79.dmPelsWidth = iWidth
80
81.dmPelsHeight = iHeight
82
83'刷新 频率为85
84
85.dmDisplayFrequency = 85
86
87End With
88
89Call ChangeDisplaySettings(DevM, 0 )
90
91End Sub
92
93Private Sub btnGetDisp_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetDisp.Click
94
95Dim X As Short = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
96
97Dim Y As Short = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
98
99MsgBox( " 您的显示器分辨率是 " & X & " X " & Y)
100
101End Sub
102
103Private Sub btnSetDisp_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetDisp.Click
104
105If MsgBox( " 您确认要将显示器分辨率改为 1024x768 吗? " , MsgBoxStyle.OKCancel, " 系统消息 " ) = MsgBoxResult.OK Then
106
107' 调用改变分辩率过程
108
109ChangeDisp( 1024 , 768 )
110
111End If
112
113End Sub
114
115程序运行如下图所示,点击设置分辩率,将会把显示器分辨率改为 1024x768 , 刷新 频率为85 , 是不是很简单?
116
117</vbfixedstring(ccformname),></vbfixedstring(ccdevicename),>