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