博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C# 开发技巧系列]如何动态设置屏幕分辨率
阅读量:6317 次
发布时间:2019-06-22

本文共 4802 字,大约阅读时间需要 16 分钟。

原文

因为最近在MSDN论坛和stackflow中看到一些朋友经常问到这个问题,所以写这篇文章来帮助大家遇到相同问题的时候可以很快的得到解决,下面就不啰嗦了,直接看代码如何解决这个问题的。

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

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

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

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

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

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

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

第三步、调用和这两个函数来实现动态改变屏幕分辨率,具体代码如下:

// 改变分辨率        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://rldaa.baihongyu.com/

你可能感兴趣的文章
ViewPager的基本使用--可左右循环切换也可自动切换
查看>>
如何做好关键词竞争度分析?
查看>>
画画板小案例
查看>>
ajax的type为get的时候报405错误,改成post就OK,这是为什么?老师写的get可以请求成功,我的就不行,附图...
查看>>
Shell 学习笔记
查看>>
JUNIT单元测试时统计代码的覆盖率工具eclemma安装
查看>>
CSS3选择器
查看>>
(状压) Marriage Ceremonies (lightOJ 1011)
查看>>
STM32F103串口配置,并且使用printf进行打印
查看>>
前端js模版 预编译工具Tmod js使用入门
查看>>
破解NetKeeper本地密码读取
查看>>
python读取json文件报 No JSON object could be decoded
查看>>
大学初体验(写于2013-2-21)
查看>>
锁优化
查看>>
MySQL事务的隔离级别
查看>>
算法和编程面试题
查看>>
内存管理1----关闭ARC
查看>>
redis源码分析4---结构体---跳跃表
查看>>
43. Multiply Strings
查看>>
正则表达式(轻松入门级)
查看>>