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

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

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

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

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

  1. // 映射 DEVMODE 结构
  2. // 可以参照 DEVMODE结构的指针定义:
  3. // http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx
  4. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  5. public struct DEVMODE
  6. {
  7. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
  8. public string dmDeviceName;
  9.  
  10. public short dmSpecVersion;
  11. public short dmDriverVersion;
  12. public short dmSize;
  13. public short dmDriverExtra;
  14. public int dmFields;
  15. public int dmPositionX;
  16. public int dmPositionY;
  17. public int dmDisplayOrientation;
  18. public int dmDisplayFixedOutput;
  19. public short dmColor;
  20. public short dmDuplex;
  21. public short dmYResolution;
  22. public short dmTTOption;
  23. public short dmCollate;
  24.  
  25. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
  26. public string dmFormName;
  27.  
  28. public short dmLogPixels;
  29. public short dmBitsPerPel;
  30. public int dmPelsWidth;
  31. public int dmPelsHeight;
  32. public int dmDisplayFlags;
  33. public int dmDisplayFrequency;
  34. public int dmICMMethod;
  35. public int dmICMIntent;
  36. public int dmMediaType;
  37. public int dmDitherType;
  38. public int dmReserved1;
  39. public int dmReserved2;
  40. public int dmPanningWidth;
  41. public int dmPanningHeight;
  42. };

第二步、在托管环境下对Win 32 函数进行声明:

  1. // Win32 函数在托管环境下的声明
  2. public class NativeMethods
  3. {
  4. // 平台调用的申明
  5. [DllImport("user32.dll")]
  6. public static extern int EnumDisplaySettings(
  7. string deviceName, int modeNum, ref DEVMODE devMode);
  8. [DllImport("user32.dll")]
  9. public static extern int ChangeDisplaySettings(
  10. ref DEVMODE devMode, int flags);
  11.  
  12. // 控制改变屏幕分辨率的常量
  13. public const int ENUM_CURRENT_SETTINGS = -;
  14. public const int CDS_UPDATEREGISTRY = 0x01;
  15. public const int CDS_TEST = 0x02;
  16. public const int DISP_CHANGE_SUCCESSFUL = ;
  17. public const int DISP_CHANGE_RESTART = ;
  18. public const int DISP_CHANGE_FAILED = -;
  19.  
  20. // 控制改变方向的常量定义
  21. public const int DMDO_DEFAULT = ;
  22. public const int DMDO_90 = ;
  23. public const int DMDO_180 = ;
  24. public const int DMDO_270 = ;
  25. }

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

  1. // 改变分辨率
  2. public ChangeResolution(int width, int height)
  3. {
  4. // 初始化 DEVMODE结构
  5. DEVMODE devmode = new DEVMODE();
  6. devmode.dmDeviceName = new String(new char[]);
  7. devmode.dmFormName = new String(new char[]);
  8. devmode.dmSize = (short)Marshal.SizeOf(devmode);
  9.  
  10. if ( != NativeMethods.EnumDisplaySettings(null, NativeMethods.ENUM_CURRENT_SETTINGS, ref devmode))
  11. {
  12. devmode.dmPelsWidth = width;
  13. devmode.dmPelsHeight = height;
  14.  
  15. // 改变屏幕分辨率
  16. int iRet = NativeMethods.ChangeDisplaySettings(ref devmode, NativeMethods.CDS_TEST);
  17.  
  18. if (iRet == NativeMethods.DISP_CHANGE_FAILED)
  19. {
  20. MessageBox.Show("不能执行你的请求", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
  21. }
  22. else
  23. {
  24. iRet = NativeMethods.ChangeDisplaySettings(ref devmode, NativeMethods.CDS_UPDATEREGISTRY);
  25.  
  26. switch (iRet)
  27. {
  28. // 成功改变
  29. case NativeMethods.DISP_CHANGE_SUCCESSFUL:
  30. {
  31. break;
  32. }
  33. case NativeMethods.DISP_CHANGE_RESTART:
  34. {
  35. MessageBox.Show("你需要重新启动电脑设置才能生效", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
  36. break;
  37. }
  38. default:
  39. {
  40. MessageBox.Show("改变屏幕分辨率失败", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
  41. break;
  42. }
  43. }
  44. }
  45. }
  46. }

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

实现源代码下载:动态设置屏幕分辨率.zip

[C# 开发技巧系列]如何动态设置屏幕分辨率的更多相关文章

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

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

  2. iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...

  3. delphi 动态更改屏幕分辨率(转)

    一.如何动态更改屏幕分辨率 有许多小工具可以在不重新启动Windows的条件下,动态更改屏幕分辨率.你是不是也想自己动手做一个呢?请在interface段中加入下面一句 function Resolu ...

  4. [Selenium] Java代码获取,设置屏幕分辨率

    import java.awt.Dimension; import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java. ...

  5. Ubuntu设置屏幕分辨率

    Ubuntu设置屏幕分辨率 原创 2016年10月14日 13:01:24 14900 在虚拟机装好Ubuntu,进入系统分辨率是800*600,打开显示界面设置下分辨率,设置完怎么也选不上应用,于是 ...

  6. 乌班图 之 设置镜像服务器 、设置屏幕分辨率QAQ

    设置镜像服务器 Ubuntu 中的大部分软件安装都是用apt命令,从Ubuntu的服务器上直接安装的. 但是国外你懂的网速是硬伤,因此要搞个镜像服务器,内容当然都是一样的咯. 第一步:进入系统设置 第 ...

  7. Ubuntu 16.04 LTS设置屏幕分辨率并永久保存所设置的分辨率

    一.问题: 1.新装完Ubuntu 16.04 LTS后,进入系统打开命令行窗口,界面的分辨率显示是最小的: 2.进入System settings-->Displays 设置屏幕分辨率 显示& ...

  8. Linux下使用 xrandr 命令设置屏幕分辨率

    最近在Linux下修改屏幕分辨率的时候,发现了一个非常有用的命令:xrandr 使用这个命令,可以方便的设置您显示器的的分辨率.尤其是当你使用了一些需要或者会自动改动您屏幕分辨率的程序以后. 您可以使 ...

  9. Ubuntu12.04设置屏幕分辨率

    Ubuntu屏幕分辨率设置 Table of Contents 1 概述 2 设置前 3 设置 4 参考 1 概述 我的Ubuntu12.04不知道被我怎么折腾了一番,屏幕的分辨率错乱了,没有办法找到 ...

随机推荐

  1. python的scikit-learn的主要模块和基本使用

    在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...

  2. byte[]数组和int之间的转换

    这里简单记录下两种转换方式: 第一种: 1.int与byte[]之间的转换(类似的byte short,long型) /** * 将int数值转换为占四个字节的byte数组,本方法适用于(低位在前,高 ...

  3. Spring第三弹—–编码剖析Spring管理Bean的原理

    先附一下编写的Spring容器的执行结果: 代码如下: 模拟的Spring容器类:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  4. TensorFlow学习笔记(四)图像识别与卷积神经网络

    一.卷积神经网络简介 卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现. ...

  5. Python(^^^^^小技巧^^^^^——不定期更新)

    偶然想到的小技巧 ''' 交互中对传入函数的参数的数目进行检测 ''' def func(a,b,c): print(a,b,c) s=input(">>>>:&qu ...

  6. PHP实现创建一个文件

    方法一:file_put_content($filename,$content); function mk_document($filename,$content=''){ // var_dump(_ ...

  7. css-1,css的三种引入方式 基本选择器

    <!-- (1)CSS 层叠样式表 作用:修饰网页结构 (2)css的三种引入方式 权重: 优先级高 权重大 谁在页面谁的权重大 - 行内样式 注意:行内样式的优先级是最高的 - 内接样式 - ...

  8. 『NiFi 节点本地流与集群流不一致导致集群加入失败』问题解决

    一.概述 在某些极端情况下,某些 NiFi 节点信息会由于用户强行 disconnect from cluster ,而出现 local flow 与 cluster 的 flow 不同步的问题. 此 ...

  9. android studio 模拟器中文乱码

    这是因为编码格式不统一导致的,在android studio的build.gradle加入默认编码声明就可以了 compileOptions.encoding = "GBK" 参考

  10. BestCoder #58 div1

    2015-10-08 19:14:54 总结:赛后补的一场.题目蛮有意思的. A:DFS 思路:搜一下几个环然后判断一下即可. #include <cstdio> #include < ...