[C# 开发技巧系列]如何动态设置屏幕分辨率
原文 http://www.cnblogs.com/zhili/archive/2013/05/23/ChangeResolution.html
因为最近在MSDN论坛和stackflow中看到一些朋友经常问到这个问题,所以写这篇文章来帮助大家遇到相同问题的时候可以很快的得到解决,下面就不啰嗦了,直接看代码如何解决这个问题的。
首先,大家应该明确,现在没有可用的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;}}}}}
为了大家更加形象地看到程序的运行结果,下面是一个演示效果:
实现源代码下载:动态设置屏幕分辨率.zip
[C# 开发技巧系列]如何动态设置屏幕分辨率相关推荐
- UE运行时动态设置屏幕分辨率
文章目录 1.实现目标 2.实现过程 2.1 控制台直接输入命令 2.2 通过蓝图设置 3.参考资料 1.实现目标 在UE中以独立进程(Standalone Game)方式启动游戏,并在运行时动态修改 ...
- android11 动态设置屏幕旋转方向
1.需求 客户动态设置屏幕的旋转方向,下次开机保持设置的屏幕方向,开关机动画也要跟着旋转. 2.分析 如果开关机动画也要跟着旋转,就不跟再LocalDisplayAdapter.java里面改了,因为 ...
- linux屏幕分辨率文件,Ubuntu 16.04 LTS设置屏幕分辨率显示Unknown display 解决
新装完Ubuntu 16.04 LTS 通过System settings-->Displays 设置屏幕分辨率 显示"Unknown display",选择后无反应,并且屏 ...
- Ubuntu 16.04 LTS设置屏幕分辨率并永久保存所设置的分辨率
更多内容请关注https://www.cnblogs.com/huangrenhui/ 一.问题: 1.新装完Ubuntu 16.04 LTS后,进入系统打开命令行窗口,界面的分辨率显示是最小的: 2 ...
- centos设置屏幕分辨率和锁屏时间
#一. 设置屏幕分辨率 打开vm虚拟机,点击活动 点击[设置] 下拉菜单找到[设备],选择分辨率即可进行设置 二.设置锁屏时间 在[设置]中找到[privacy]选项 点击打开[锁屏] 可以自己设置锁 ...
- ubuntu16.04中用xrandr设置屏幕分辨率,且重启后不失效
xrandr设置屏幕分辨率,重启后失效 xrandr -s 1440x900_59.9 xrandr --output Virtual1 --mode 1440x900 问题描述: ubuntu16. ...
- 移动端开发使用rem时动态设置html的字体大小
1.动态设置html的字体大小 移动端开发时习惯使用rem单位,而rem是基于根html的字体大小的,为了适配不同尺寸屏幕需要动态设置html字体的大小.我们一般习惯于设置html的字体大小是基于iP ...
- Ubuntu设置屏幕分辨率及屏幕翻转
首发于:yuany3721的WordPress Version: Ubuntu 18.04.6 LTS 使用xrandr查看屏幕信息 $ xrandr Screen 0: minimum 320 x ...
- 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计
.主要是为了总结一下 对这些概念有个直观的认识; . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/198 ...
最新文章
- javascript中的字典
- 实用常识 | 巧妙使用IA图片助手多地址提取批量下载(老白嫖怪了)
- 【Python】【Python语言】Python3.7.2的关键字与保留字
- 零基础转行自学前端,怎么学习更系统?
- 年后跳槽 BAT 必看,10 种干货帮你 Offer 拿到手软!
- jQuery Mobile中弹窗popup的data-*选项
- python--简易员工信息系统编写
- LINUX doubango编译中prefix参数无效
- Rhadoop的安装
- 科研计算机视觉常用绘图软件,科研图形处理——除了R、Graphpad外,这款软件也不要错过哦!...
- cuda历史版本下载
- ubuntu linux修改ip地址命令,永久修改ubuntu系统MAC和IP地址的方法命令
- VSCode配置git图文
- 售前技能——自我定位
- 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径, 使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。
- TCP/IP详解学习笔记 这位仁兄写得太好了
- 戏说Android四大组件之ContentProvider
- python3 scrapy框架,Python3爬虫(十八) Scrapy框架(二)
- Cocos2d-x 3.2 之 进度条 progressTimer
- 算法工程师面试题八之交叉验证
热门文章
- java tm 安装在哪里,安装以及配置Java环境
- oracle的shell命令,Shell实现的Oracle启动脚本分享
- centos php sftp 扩展,Linux(CentOS)上配置 SFTP
- Redis序列化配置类
- 智能车竞赛B车模车轮毂断裂原因所在
- 第十六届全国大学生智能汽车竞赛 英飞凌芯片申请情况
- python cv2模块安装_Python运行脚本前,自动安装需要的模块包
- java 停顿 分钟_java - 年轻的垃圾收集更长时间停顿与Java 7 vs java 6 - 堆栈内存溢出...
- android平板开发板,利用开源开发板自制的平板电脑 | 雷锋网
- mysql数据库木马查杀_Linux系统木马后门查杀方法详解