0%

C#如何动态设置屏幕分辨率 - jack_Meng - 博客园

Excerpt

C#如何动态设置屏幕分辨率 作者:Learning hard 这篇文章主要为大家详细介绍了C#动态设置屏幕分辨率的方法,我们可以使用Screen类设置屏幕分辨率,感兴趣的小伙伴们可以参考一下 下面就不啰嗦了,直接看代码如何解决这个问题的。 首先,大家应该明确,现在没有可用的API来给我们动态地设置屏


C#如何动态设置屏幕分辨率

作者:Learning hard 

这篇文章主要为大家详细介绍了C#动态设置屏幕分辨率的方法,我们可以使用Screen类设置屏幕分辨率,感兴趣的小伙伴们可以参考一下

下面就不啰嗦了,直接看代码如何解决这个问题的。

首先,大家应该明确,现在没有可用的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 结构的指针,它们分别包含与显示设置有关的所有信息:

使用 EnumDisplaySettings 读取当前显示设置,并枚举所有受支持的显示设置。

使用 ChangeDisplaySettings 切换到新的显示设置。

第一步、我们要先定义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

  [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 函数进行声明:

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

  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这两个函数来实现动态改变屏幕分辨率,具体代码如下:

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 = 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

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