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