C#如何动态设置屏幕分辨率
下面就不啰嗦了,直接看代码如何解决这个问题的。
首先,大家应该明确,现在没有可用的api来给我们动态地设置屏幕分辨率,我们要实现这个需求,我们只能在c#程序中调用win32 api 函数来解决这个问题的,这里用c#代码调用win32 api 就涉及到一个问题的,即.net 互操作性的问题,关于这个大家可以参考我的互操作性系列文章。这里我就不过多解释了。
我们要解决这个问题,首先大家肯定也会遇到一个经常遇到的问题,即如何获得用户的分辨率,对于这个问题,.net中提供的单独的类给我们调用,我们可以使用screen这个类,具体看下面的示例代码:
screen screen = screen.primaryscreen; int screenwidth= screen.bounds.width; int screenheight = screen.bounds.height;
然后就是如何改变屏幕的分辨率呢?要更改显示设置可以通过使用两个 win32 api 来完成,这两个 api 都具有指向 devmode 结构的指针,它们分别包含与显示设置有关的所有信息:
使用 enumdisplaysettings 读取当前显示设置,并枚举所有受支持的显示设置。
使用 changedisplaysettings 切换到新的显示设置。
第一步、我们要先定义devmode 结构体,该结构的结构必须与devmode的结构一致,下面是c#中对devmode 结构体的定义代码:
// 映射 devmode 结构 // 可以参照 devmode结构的指针定义: // http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx [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; };
第二步、在托管环境下对win 32 函数进行声明:
// 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; }
第三步、调用enumdisplaysettings和changedisplaysettings这两个函数来实现动态改变屏幕分辨率,具体代码如下:
// 改变分辨率 public changeresolution(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) { messagebox.show("不能执行你的请求", "信息", messageboxbuttons.ok, messageboxicon.information); } else { iret = nativemethods.changedisplaysettings(ref devmode, nativemethods.cds_updateregistry); switch (iret) { // 成功改变 case nativemethods.disp_change_successful: { break; } case nativemethods.disp_change_restart: { messagebox.show("你需要重新启动电脑设置才能生效", "信息", messageboxbuttons.ok, messageboxicon.information); break; } default: { messagebox.show("改变屏幕分辨率失败", "信息", messageboxbuttons.ok, messageboxicon.information); break; } } } } }
为了大家更加形象地看到程序的运行结果,下面是一个演示效果:
以上就是本文的全部内容,希望对大家的学习有所帮助。
上一篇: Windows系统中使用C#编写蓝牙通信程序的简单实例
下一篇: 微信小程序实现日期格式化和倒计时