C# 要如何才能实现代码修改系统桌面显示的分辨率

编程开发
148
C#
修改系统桌面
修改分辨率

C# 要如何才能实现代码修改系统桌面显示的分辨率

估计挺多人都有过这个想法,现实很可惜微软并未在.net框架中提供直接修改桌面显示的分辨率的函数

但也并不是说这个功能无法实现 只是无法通过.NET框架直接去操作,可以借助万能的WIN32API来实现这个功能

这个是微软官方提供的文档资料

https://docs.microsoft.com/zh-cn/windows/win32/api/wingdi/ns-wingdi-devmodea?redirectedfrom=MSDN


以下是网上找到的一个办法:

实现思路: 先想办法拿到当前系统受支持的所有显示配置信息 然后通过Win32接口进行修改设置

第一、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;
  }

第二:需要用到 DEVMODE 结构的指针

[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;
  }

第三:实现调用修改分辨率的方法实现

 // 改变分辨率
  public SetResolution(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)
      {
        //不能执行你的请求
      }
      else
      {
        iRet = NativeMethods.ChangeDisplaySettings(ref devmode, NativeMethods.CDS_UPDATEREGISTRY);

        switch (iRet)
        {
          case NativeMethods.DISP_CHANGE_SUCCESSFUL:
            {
			 //设置成功
              break;
            }
          case NativeMethods.DISP_CHANGE_RESTART:
            {
              //需要重新启动电脑设置才能生效
              break;
            }
          default:
            {
              //改变屏幕分辨率失败
              break;
            }
        }
      }
    }
}

vs编译时报错 不安全代码只会在使用 /unsafe 编译的情况下出现
WPF 异步线程操作界面控件
C#编程怎么使用正则表达式提取或匹配内容
 C# 实现 Rsa字符串非对称加密简单例子
 C#实现图像以中心点任意角度旋转
WPF 数据转换器 IValueConverter例子
C# 去掉去除文本字符中的空格\换行\html标签
Web上传文件请求报错超过了最大请求长度
c# 获取本机电脑名称、Ip信息
C#如何利用(Windows Script Host)COM组件来创建快捷方式
VS错误提示无法嵌入互操作类型“IWshShell_ClassClass”,请改用适用的接口的解决方法
C# 操作DOS添加端口防火墙名单
暂无相关内容...
C#结合虫洞软件(Wormhole)实现自动登录到手机版百度网盘的流程源码
.NET5+C# WPF实现图片添加倾斜文字平铺水印工具源码
基于Wpf+MVVM实现的完整截图软件的框选区域效果源码
 远程控制软件Radmin3.4 中文完整版(控制端和被控端)
[人脸检测]基于C#OpenCvSharp+haarcascade人脸、人眼模型实现人脸检测源码
visual studio 2019在线安装包和激活码密钥key
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删