因为最近在MSDN论坛和stackflow中看到一些朋友经常问到这个问题,所以写这篇文章来帮助大家遇到相同问题的时候可以很快的得到解决,下面就不啰嗦了,直接看代码如何解决这个问题的。
第一步、我们要先定义DEVMODE 结构体,该结构的结构必须与DEVMODE的结构一致,下面是C#中对DEVMODE 结构体的定义代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<code>// 映射 DEVMODE 结构</code>
<code> </code><code>// 可以参照 DEVMODE结构的指针定义:</code>
<code> </code><code>// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx</code>
<code> </code><code>[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]</code>
<code> </code><code>public</code> <code>struct</code> <code>DEVMODE</code>
<code> </code><code>{</code>
<code> </code><code>[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]</code>
<code> </code><code>public</code> <code>string</code> <code>dmDeviceName;</code>
<code> </code><code>public</code> <code>short</code> <code>dmSpecVersion;</code>
<code> </code><code>public</code> <code>short</code> <code>dmDriverVersion;</code>
<code> </code><code>public</code> <code>short</code> <code>dmSize;</code>
<code> </code><code>public</code> <code>short</code> <code>dmDriverExtra;</code>
<code> </code><code>public</code> <code>int</code> <code>dmFields;</code>
<code> </code><code>public</code> <code>int</code> <code>dmPositionX;</code>
<code> </code><code>public</code> <code>int</code> <code>dmPositionY;</code>
<code> </code><code>public</code> <code>int</code> <code>dmDisplayOrientation;</code>
<code> </code><code>public</code> <code>int</code> <code>dmDisplayFixedOutput;</code>
<code> </code><code>public</code> <code>short</code> <code>dmColor;</code>
<code> </code><code>public</code> <code>short</code> <code>dmDuplex;</code>
<code> </code><code>public</code> <code>short</code> <code>dmYResolution;</code>
<code> </code><code>public</code> <code>short</code> <code>dmTTOption;</code>
<code> </code><code>public</code> <code>short</code> <code>dmCollate;</code>
<code> </code><code>public</code> <code>string</code> <code>dmFormName;</code>
<code> </code><code>public</code> <code>short</code> <code>dmLogPixels;</code>
<code> </code><code>public</code> <code>short</code> <code>dmBitsPerPel;</code>
<code> </code><code>public</code> <code>int</code> <code>dmPelsWidth;</code>
<code> </code><code>public</code> <code>int</code> <code>dmPelsHeight;</code>
<code> </code><code>public</code> <code>int</code> <code>dmDisplayFlags;</code>
<code> </code><code>public</code> <code>int</code> <code>dmDisplayFrequency;</code>
<code> </code><code>public</code> <code>int</code> <code>dmICMMethod;</code>
<code> </code><code>public</code> <code>int</code> <code>dmICMIntent;</code>
<code> </code><code>public</code> <code>int</code> <code>dmMediaType;</code>
<code> </code><code>public</code> <code>int</code> <code>dmDitherType;</code>
<code> </code><code>public</code> <code>int</code> <code>dmReserved1;</code>
<code> </code><code>public</code> <code>int</code> <code>dmReserved2;</code>
<code> </code><code>public</code> <code>int</code> <code>dmPanningWidth;</code>
<code> </code><code>public</code> <code>int</code> <code>dmPanningHeight;</code>
<code> </code><code>};</code>
第二步、在托管环境下对Win 32 函数进行声明:
<code>// Win32 函数在托管环境下的声明</code>
<code> </code><code>public</code> <code>class</code> <code>NativeMethods</code>
<code> </code><code>// 平台调用的申明</code>
<code> </code><code>[DllImport(</code><code>"user32.dll"</code><code>)]</code>
<code> </code><code>public</code> <code>static</code> <code>extern</code> <code>int</code> <code>EnumDisplaySettings(</code>
<code> </code><code>string</code> <code>deviceName, </code><code>int</code> <code>modeNum, </code><code>ref</code> <code>DEVMODE devMode);</code>
<code> </code><code>public</code> <code>static</code> <code>extern</code> <code>int</code> <code>ChangeDisplaySettings(</code>
<code> </code><code>ref</code> <code>DEVMODE devMode, </code><code>int</code> <code>flags);</code>
<code> </code><code>// 控制改变屏幕分辨率的常量</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>ENUM_CURRENT_SETTINGS = -1;</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>CDS_UPDATEREGISTRY = 0x01;</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>CDS_TEST = 0x02;</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>DISP_CHANGE_SUCCESSFUL = 0;</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>DISP_CHANGE_RESTART = 1;</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>DISP_CHANGE_FAILED = -1;</code>
<code> </code><code>// 控制改变方向的常量定义</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>DMDO_DEFAULT = 0;</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>DMDO_90 = 1;</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>DMDO_180 = 2;</code>
<code> </code><code>public</code> <code>const</code> <code>int</code> <code>DMDO_270 = 3;</code>
<code> </code><code>}</code>
40
41
42
<code>// 改变分辨率</code>
<code> </code><code>public</code> <code>ChangeResolution(</code><code>int</code> <code>width, </code><code>int</code> <code>height)</code>
<code> </code><code>{</code>
<code> </code><code>// 初始化 DEVMODE结构</code>
<code> </code><code>DEVMODE devmode = </code><code>new</code> <code>DEVMODE();</code>
<code> </code><code>devmode.dmDeviceName = </code><code>new</code> <code>String(</code><code>new</code> <code>char</code><code>[32]);</code>
<code> </code><code>devmode.dmFormName = </code><code>new</code> <code>String(</code><code>new</code> <code>char</code><code>[32]);</code>
<code> </code><code>devmode.dmSize = (</code><code>short</code><code>)Marshal.SizeOf(devmode);</code>
<code> </code><code>if</code> <code>(0 != NativeMethods.EnumDisplaySettings(</code><code>null</code><code>, NativeMethods.ENUM_CURRENT_SETTINGS, </code><code>ref</code> <code>devmode))</code>
<code> </code><code>{</code>
<code> </code><code>devmode.dmPelsWidth = width;</code>
<code> </code><code>devmode.dmPelsHeight = height;</code>
<code> </code><code>// 改变屏幕分辨率</code>
<code> </code><code>int</code> <code>iRet = NativeMethods.ChangeDisplaySettings(</code><code>ref</code> <code>devmode, NativeMethods.CDS_TEST);</code>
<code> </code><code>if</code> <code>(iRet == NativeMethods.DISP_CHANGE_FAILED)</code>
<code> </code><code>{</code>
<code> </code><code>MessageBox.Show(</code><code>"不能执行你的请求"</code><code>, </code><code>"信息"</code><code>, MessageBoxButtons.OK, MessageBoxIcon.Information);</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>iRet = NativeMethods.ChangeDisplaySettings(</code><code>ref</code> <code>devmode, NativeMethods.CDS_UPDATEREGISTRY);</code>
<code> </code><code>switch</code> <code>(iRet)</code>
<code> </code><code>{</code>
<code> </code><code>// 成功改变</code>
<code> </code><code>case</code> <code>NativeMethods.DISP_CHANGE_SUCCESSFUL:</code>
<code> </code><code>{</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>case</code> <code>NativeMethods.DISP_CHANGE_RESTART:</code>
<code> </code><code>MessageBox.Show(</code><code>"你需要重新启动电脑设置才能生效"</code><code>, </code><code>"信息"</code><code>, MessageBoxButtons.OK, MessageBoxIcon.Information);</code>
<code> </code><code>default</code><code>:</code>
<code> </code><code>MessageBox.Show(</code><code>"改变屏幕分辨率失败"</code><code>, </code><code>"信息"</code><code>, MessageBoxButtons.OK, MessageBoxIcon.Information);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
为了大家更加形象地看到程序的运行结果,下面是一个演示效果:
<a href="http://down.51cto.com/data/2362889" target="_blank">附件:http://down.51cto.com/data/2362889</a>
本文转自LearningHard 51CTO博客,原文链接:http://blog.51cto.com/learninghard/1207708,如需转载请自行联系原作者