C#如何動態設置屏幕分辨率

C#如何動態設置屏幕分辨率

做者:Learning hard html

這篇文章主要爲你們詳細介紹了C#動態設置屏幕分辨率的方法,咱們可使用Screen類設置屏幕分辨率,感興趣的小夥伴們能夠參考一下

下面就不囉嗦了,直接看代碼如何解決這個問題的。windows

首先,你們應該明確,如今沒有可用的API來給咱們動態地設置屏幕分辨率,咱們要實現這個需求,咱們只能在C#程序中調用Win32 API 函數來解決這個問題的,這裏用C#代碼調用Win32 API 就涉及到一個問題的,即.NET 互操做性的問題,關於這個你們能夠參考個人互操做性系列文章。這裏我就不過多解釋了。函數

咱們要解決這個問題,首先你們確定也會遇到一個常常遇到的問題,即如何得到用戶的分辨率,對於這個問題,.NET中提供的單獨的類給咱們調用,咱們可使用Screen這個類,具體看下面的示例代碼:學習

?
1
2
3
Screen screen = Screen.PrimaryScreen;
      int screenWidth= screen.Bounds.Width;
      int screenHeight = screen.Bounds.Height;

而後就是如何改變屏幕的分辨率呢?要更改顯示設置能夠經過使用兩個 Win32 API 來完成,這兩個 API 都具備指向 DEVMODE 結構的指針,它們分別包含與顯示設置有關的全部信息:this

使用 EnumDisplaySettings 讀取當前顯示設置,並枚舉全部受支持的顯示設置。spa

使用 ChangeDisplaySettings 切換到新的顯示設置。.net

第一步、咱們要先定義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
40
41
42
// 映射 DEVMODE 結構
   // 能夠參照 DEVMODE結構的指針定義:
   [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
   public struct DEVMODE
   {
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
     public string dmDeviceName;
 
     public short dmSpecVersion;
     public short dmDriverVersion;
     public short dmSize;
     public short dmDriverExtra;
     public int dmFields;
     public int dmPositionX;
     public int dmPositionY;
     public int dmDisplayOrientation;
     public int dmDisplayFixedOutput;
     public short dmColor;
     public short dmDuplex;
     public short dmYResolution;
     public short dmTTOption;
     public short dmCollate;
 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
     public string dmFormName;
 
     public short dmLogPixels;
     public short dmBitsPerPel;
     public int dmPelsWidth;
     public int dmPelsHeight;
     public int dmDisplayFlags;
     public int dmDisplayFrequency;
     public int dmICMMethod;
     public int dmICMIntent;
     public int dmMediaType;
     public int dmDitherType;
     public int dmReserved1;
     public int dmReserved2;
     public int dmPanningWidth;
     public int dmPanningHeight;
   };

第二步、在託管環境下對Win 32 函數進行聲明:
code

?
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
// Win32 函數在託管環境下的聲明
   public class NativeMethods
   {
     // 平臺調用的申明
     [DllImport( "user32.dll" )]
     public static extern int EnumDisplaySettings(
      string deviceName, int modeNum, ref DEVMODE devMode);
     [DllImport( "user32.dll" )]
     public static extern int ChangeDisplaySettings(
        ref DEVMODE devMode, int flags);
 
     // 控制改變屏幕分辨率的常量
     public const int ENUM_CURRENT_SETTINGS = -1;
     public const int CDS_UPDATEREGISTRY = 0x01;
     public const int CDS_TEST = 0x02;
     public const int DISP_CHANGE_SUCCESSFUL = 0;
     public const int DISP_CHANGE_RESTART = 1;
     public const int DISP_CHANGE_FAILED = -1;
 
     // 控制改變方向的常量定義
     public const int DMDO_DEFAULT = 0;
     public const int DMDO_90 = 1;
     public const int DMDO_180 = 2;
     public const int DMDO_270 = 3;
   }

第三步、調用EnumDisplaySettings和ChangeDisplaySettings這兩個函數來實現動態改變屏幕分辨率,具體代碼以下:
orm

?
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
40
41
42
43
44
45
46
// 改變分辨率
   public ChangeResolution( int width, int height)
   {
     // 初始化 DEVMODE結構
     DEVMODE devmode = new DEVMODE();
     devmode.dmDeviceName = new String( new char [32]);
     devmode.dmFormName = new String( new char [32]);
     devmode.dmSize = ( short )Marshal.SizeOf(devmode);
 
     if (0 != NativeMethods.EnumDisplaySettings( null , NativeMethods.ENUM_CURRENT_SETTINGS, ref devmode))
     {
       devmode.dmPelsWidth = width;
       devmode.dmPelsHeight = height;
 
       // 改變屏幕分辨率
       int iRet = NativeMethods.ChangeDisplaySettings( ref devmode, NativeMethods.CDS_TEST);
 
       if (iRet == NativeMethods.DISP_CHANGE_FAILED)
       {
         MessageBox.Show( "不能執行你的請求" , "信息" , MessageBoxButtons.OK, MessageBoxIcon.Information);
       }
       else
       {
         iRet = NativeMethods.ChangeDisplaySettings( ref devmode, NativeMethods.CDS_UPDATEREGISTRY);
 
         switch (iRet)
         {
             // 成功改變
           case NativeMethods.DISP_CHANGE_SUCCESSFUL:
             {
               break ;
             }
           case NativeMethods.DISP_CHANGE_RESTART:
             {
               MessageBox.Show( "你須要從新啓動電腦設置才能生效" , "信息" , MessageBoxButtons.OK, MessageBoxIcon.Information);
               break ;
             }
           default :
             {
               MessageBox.Show( "改變屏幕分辨率失敗" , "信息" , MessageBoxButtons.OK, MessageBoxIcon.Information);
               break ;
             }
         }
       }
     }
   }

爲了你們更加形象地看到程序的運行結果,下面是一個演示效果:

以上就是本文的所有內容,但願對你們的學習有所幫助。

 

出處:http://www.jb51.net/article/82013.htm

https://zhidao.baidu.com/question/1544149072026431227.html

對於以上第一步、第二步、第三步中的代碼能夠單獨保存在一個類中,這樣使用比較方便,你在使用的時候,可能還須要作一些簡單的引用或調整。下面有時間了我會把我整理的代碼發出來。

相關文章
相關標籤/搜索