『QQ:1353814576』

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