天天看点

[C# 开发技巧系列]如何动态设置屏幕分辨率

因为最近在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>

为了大家更加形象地看到程序的运行结果,下面是一个演示效果:

[C# 开发技巧系列]如何动态设置屏幕分辨率

<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,如需转载请自行联系原作者

继续阅读