天天看點

[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,如需轉載請自行聯系原作者

繼續閱讀