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

 更新时间:2016年04月06日 15:00:43   作者:Learning hard  
这篇文章主要为大家详细介绍了C#动态设置屏幕分辨率的方法,我们可以使用Screen类设置屏幕分辨率,感兴趣的小伙伴们可以参考一下

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

首先,大家应该明确,现在没有可用的API来给我们动态地设置屏幕分辨率,我们要实现这个需求,我们只能在C#程序中调用Win32 API 函数来解决这个问题的,这里用C#代码调用Win32 API 就涉及到一个问题的,即.NET 互操作性的问题,关于这个大家可以参考我的互操作性系列文章。这里我就不过多解释了。

我们要解决这个问题,首先大家肯定也会遇到一个经常遇到的问题,即如何获得用户的分辨率,对于这个问题,.NET中提供的单独的类给我们调用,我们可以使用Screen这个类,具体看下面的示例代码:

 Screen screen = Screen.PrimaryScreen;
      int screenWidth= screen.Bounds.Width;
      int screenHeight = screen.Bounds.Height;

然后就是如何改变屏幕的分辨率呢?要更改显示设置可以通过使用两个 Win32 API 来完成,这两个 API 都具有指向 DEVMODE 结构的指针,它们分别包含与显示设置有关的所有信息:

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

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

第一步、我们要先定义DEVMODE 结构体,该结构的结构必须与DEVMODE的结构一致,下面是C#中对DEVMODE 结构体的定义代码:

// 映射 DEVMODE 结构
  // 可以参照 DEVMODE结构的指针定义:
  // http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx
  [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 函数进行声明:

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

  // 改变分辨率
    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;
              }
          }
        }
      }
    }

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

以上就是本文的全部内容,希望对大家的学习有所帮助。

相关文章

  • c#实现sunday算法实例

    c#实现sunday算法实例

    Sunday算法思想跟BM算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符,下面是用C#实现sunday的实例代码,有需要的朋友可以参考一下
    2013-08-08
  • C#数据结构之最小堆的实现方法

    C#数据结构之最小堆的实现方法

    这篇文章主要给大家介绍了关于C#数据结构之最小堆的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C#关于System.Collections空间详解

    C#关于System.Collections空间详解

    这篇文章主要介绍了C#关于System.Collections空间,需要的朋友可以参考下
    2014-07-07
  • .NET使用C#设置Excel单元格数值格式

    .NET使用C#设置Excel单元格数值格式

    这篇文章主要为大家详细介绍了如何使用C#在.NET程序中实现对Excel单元格数字格式的设置,帮助实现更完善的Excel文件处理,感兴趣的小伙伴可以了解下
    2024-12-12
  • C#如何自动识别文件的编码

    C#如何自动识别文件的编码

    相信每位程序员在日常学习工作中,文件编码识别是必不可少的,一旦编码错误就会出现让人头疼的乱码,那么下面这篇文章将给大家介绍如何通过C#来自动识别文件的编码。文中给出了详细的示例代码,对大家的理解很有帮助,下面跟着小编一起来学习学习吧。
    2016-12-12
  • C#正则函数用法实例【匹配、替换、提取】

    C#正则函数用法实例【匹配、替换、提取】

    这篇文章主要介绍了C#正则函数用法,结合实例形式分析了C#基于正则的匹配、替换、提取相关操作技巧,需要的朋友可以参考下
    2017-01-01
  • C#随机设置900-1100毫秒延迟的方法

    C#随机设置900-1100毫秒延迟的方法

    这篇文章主要介绍了C#随机设置900-1100毫秒延迟的方法,涉及C#中Thread.Sleep方法的使用技巧,需要的朋友可以参考下
    2015-04-04
  • C#的锯齿数组以及C++实现代码

    C#的锯齿数组以及C++实现代码

    锯齿数组首先是二维数组,第一维的维数是确定的。之所以在C#中能够出现灵活的锯齿数组,是因为,C#的数组是引用类型(本质上存放的是指针)。根据这个引用类型(指针)的概念,C++中用指针数组同样可以实现
    2013-09-09
  • C# 操作 MongoDB的示例demo

    C# 操作 MongoDB的示例demo

    这篇文章主要介绍了C# 操作 MongoDB的示例demo,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-12-12
  • Unity C#执行bat脚本的操作

    Unity C#执行bat脚本的操作

    这篇文章主要介绍了Unity C#执行bat脚本的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论