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

对于以上第一步、第二步、第三步中的代码能够单独保存在一个类中,这样使用比较方便,你在使用的时候,可能还须要作一些简单的引用或调整。下面有时间了我会把我整理的代码发出来。

相关文章
相关标签/搜索