using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;using LiBo.Win32;namespace LiBo.Hardware
{
/// <summary>
/// 显示器修改后的结果。
/// </summary>
public enum DisplaySettingsResults {
#region 实现
/// <summary>显示器设置修改成功。</summary>
Successful = User.DISP_CHANGE_SUCCESSFUL,
/// <summary>传入了一个无效的标记集。</summary>
BadFlags = User.DISP_CHANGE_BADFLAGS,
/// <summary>图形模式不支持。</summary>
BadMode = User.DISP_CHANGE_BADMODE,
/// <summary>传入了无效的参数。</summary>
BadParam = User.DISP_CHANGE_BADPARAM,
/// <summary>显示器设置修改失败。</summary>
Failed = User.DISP_CHANGE_FAILED,
/// <summary>无法将设置写入注册表。</summary>
NotUpdated = User.DISP_CHANGE_NOTUPDATED,
/// <summary>需要重新启动计算机才能使新的设置生效。</summary>
Restart = User.DISP_CHANGE_RESTART
#endregion
}
/// <summary>
/// Monitor 类用于显示器相关的操作。
/// </summary>
public class Monitor {
/// <summary>
/// 设置显示器的分辨率
/// </summary>
/// <param name="width">新的分辨率的宽度</param>
/// <param name="height">新的分辨率的高度</param>
/// <returns>显示器修改后的结果。</returns>
public static DisplaySettingsResults ChangeSize(int width, int height) {
#region 实现
DEVMODE dm = new DEVMODE();
dm.dmDeviceName = new String(new char[32]);
dm.dmFormName = new String(new char[32]);
dm.dmSize = (short)Marshal.SizeOf(dm); if (0 != User.EnumDisplaySettings(null, User.ENUM_CURRENT_SETTINGS, ref dm)) {
dm.dmPelsWidth = width;
dm.dmPelsHeight = height; int flag = User.ChangeDisplaySettings(ref dm, User.CDS_TEST); if (flag == User.DISP_CHANGE_FAILED) {
return DisplaySettingsResults.Failed;
} else {
flag = User.ChangeDisplaySettings(ref dm, User.CDS_UPDATEREGISTRY); switch (flag) {
case User.DISP_CHANGE_SUCCESSFUL:
return DisplaySettingsResults.Successful;
case User.DISP_CHANGE_BADFLAGS:
return DisplaySettingsResults.BadFlags;
case User.DISP_CHANGE_BADMODE:
return DisplaySettingsResults.BadMode;
case User.DISP_CHANGE_BADPARAM:
return DisplaySettingsResults.BadParam;
/*case User.DISP_CHANGE_FAILED:
return DisplaySettingsResults.Failed;*/
case User.DISP_CHANGE_NOTUPDATED:
return DisplaySettingsResults.NotUpdated;
case User.DISP_CHANGE_RESTART:
return DisplaySettingsResults.Restart;
}
}
}
return DisplaySettingsResults.Failed;
#endregion
} /// <summary>
/// 获取桌面上显示监视器的数目。
/// </summary>
public static int Count {
get { return SystemInformation.MonitorCount; }
} /// <summary>
/// 获取一个值,该值指示是否所有显示监视器都具有相同的颜色格式。
/// </summary>
public static bool SameDisplayFormat {
get { return SystemInformation.MonitorsSameDisplayFormat; }
} /// <summary>
/// 获取主显示监视器的尺寸(以像素为单位)。
/// </summary>
public static Size PrimaryMonitorSize {
get { return SystemInformation.PrimaryMonitorSize; }
} /// <summary>
/// 获取工作区域的大小(以像素为单位)。
/// </summary>
/// <res>使用 WorkingArea 可确定可由应用程序使用的屏幕的界限。
/// 工作区域是未被操作系统任务栏隐藏的屏幕部分以及其他停靠于 Windows 桌面的顶级窗口。</res>
public static Rectangle WorkingArea {
get { return SystemInformation.WorkingArea; }
}
}
}
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;using LiBo.Win32;namespace LiBo.Hardware
{
/// <summary>
/// 显示器修改后的结果。
/// </summary>
public enum DisplaySettingsResults {
#region 实现
/// <summary>显示器设置修改成功。</summary>
Successful = User.DISP_CHANGE_SUCCESSFUL,
/// <summary>传入了一个无效的标记集。</summary>
BadFlags = User.DISP_CHANGE_BADFLAGS,
/// <summary>图形模式不支持。</summary>
BadMode = User.DISP_CHANGE_BADMODE,
/// <summary>传入了无效的参数。</summary>
BadParam = User.DISP_CHANGE_BADPARAM,
/// <summary>显示器设置修改失败。</summary>
Failed = User.DISP_CHANGE_FAILED,
/// <summary>无法将设置写入注册表。</summary>
NotUpdated = User.DISP_CHANGE_NOTUPDATED,
/// <summary>需要重新启动计算机才能使新的设置生效。</summary>
Restart = User.DISP_CHANGE_RESTART
#endregion
}
/// <summary>
/// Monitor 类用于显示器相关的操作。
/// </summary>
public class Monitor {
/// <summary>
/// 设置显示器的分辨率
/// </summary>
/// <param name="width">新的分辨率的宽度</param>
/// <param name="height">新的分辨率的高度</param>
/// <returns>显示器修改后的结果。</returns>
public static DisplaySettingsResults ChangeSize(int width, int height) {
#region 实现
DEVMODE dm = new DEVMODE();
dm.dmDeviceName = new String(new char[32]);
dm.dmFormName = new String(new char[32]);
dm.dmSize = (short)Marshal.SizeOf(dm); if (0 != User.EnumDisplaySettings(null, User.ENUM_CURRENT_SETTINGS, ref dm)) {
dm.dmPelsWidth = width;
dm.dmPelsHeight = height; int flag = User.ChangeDisplaySettings(ref dm, User.CDS_TEST); if (flag == User.DISP_CHANGE_FAILED) {
return DisplaySettingsResults.Failed;
} else {
flag = User.ChangeDisplaySettings(ref dm, User.CDS_UPDATEREGISTRY); switch (flag) {
case User.DISP_CHANGE_SUCCESSFUL:
return DisplaySettingsResults.Successful;
case User.DISP_CHANGE_BADFLAGS:
return DisplaySettingsResults.BadFlags;
case User.DISP_CHANGE_BADMODE:
return DisplaySettingsResults.BadMode;
case User.DISP_CHANGE_BADPARAM:
return DisplaySettingsResults.BadParam;
/*case User.DISP_CHANGE_FAILED:
return DisplaySettingsResults.Failed;*/
case User.DISP_CHANGE_NOTUPDATED:
return DisplaySettingsResults.NotUpdated;
case User.DISP_CHANGE_RESTART:
return DisplaySettingsResults.Restart;
}
}
}
return DisplaySettingsResults.Failed;
#endregion
} /// <summary>
/// 获取桌面上显示监视器的数目。
/// </summary>
public static int Count {
get { return SystemInformation.MonitorCount; }
} /// <summary>
/// 获取一个值,该值指示是否所有显示监视器都具有相同的颜色格式。
/// </summary>
public static bool SameDisplayFormat {
get { return SystemInformation.MonitorsSameDisplayFormat; }
} /// <summary>
/// 获取主显示监视器的尺寸(以像素为单位)。
/// </summary>
public static Size PrimaryMonitorSize {
get { return SystemInformation.PrimaryMonitorSize; }
} /// <summary>
/// 获取工作区域的大小(以像素为单位)。
/// </summary>
/// <res>使用 WorkingArea 可确定可由应用程序使用的屏幕的界限。
/// 工作区域是未被操作系统任务栏隐藏的屏幕部分以及其他停靠于 Windows 桌面的顶级窗口。</res>
public static Rectangle WorkingArea {
get { return SystemInformation.WorkingArea; }
}
}
}
using System.Collections; using System.ComponentModel;
usingSystem.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace ScreenResolution
{
public class Form1 : System.Windows.Forms.Form
{
public enum DMDO
{
DEFAULT = 0, D90 = 1, D180 = 2, D270 = 3
} [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
struct DEVMODE
{ public const int DM_DISPLAYFREQUENCY = 0x400000; public const int DM_PELSWIDTH = 0x80000; public const int DM_PELSHEIGHT = 0x100000; private const int CCHDEVICENAME = 32; private const int CCHFORMNAME = 32; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=CCHDEVICENAME)] 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 DMDO dmDisplayOrientation; public int dmDisplayFixedOutput; public short dmColor; public short dmDuplex; public short dmYResolution; public short dmTTOption; public short dmCollate; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=CCHFORMNAME)] public string dmFormName; public short dmLogPixels; public int 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; } [DllImport("user32.dll", CharSet=CharSet.Auto)] //static extern int ChangeDisplaySettings( DEVMODE lpDevMode, int dwFlags); static extern int ChangeDisplaySettings( [In] ref DEVMODE lpDevMode, int dwFlags); private System.ComponentModel.Container components = null; public Form1() { InitializeComponent(); } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code private void InitializeComponent() { this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(292, 273); this.Text = "改变屏幕分辨率的例子"; } #endregion static void Main() { Form1 r = new Form1(); r.ChangeRes(); Application.Run(new Form1()); } void ChangeRes() { Form1 t = new Form1(); long RetVal=0; DEVMODE dm = new DEVMODE(); dm.dmSize= (short)Marshal.SizeOf(typeof(DEVMODE)); dm.dmPelsWidth = 1024; dm.dmPelsHeight= 768; dm.dmDisplayFrequency=85; dm.dmFields = DEVMODE.DM_PELSWIDTH | DEVMODE.DM_PELSHEIGHT | DEVMODE.DM_DISPLAYFREQUENCY; RetVal = ChangeDisplaySettings(ref dm, 0); } } }
作者:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices; namespace ScreenResolution
{ public class Form1 : System.Windows.Forms.Form
{
public enum DMDO
{
DEFAULT = 0,
D90 = 1,
D180 = 2,
D270 = 3
} [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
struct DEVMODE
{
public const int DM_DISPLAYFREQUENCY = 0x400000;
public const int DM_PELSWIDTH = 0x80000;
public const int DM_PELSHEIGHT = 0x100000;
private const int CCHDEVICENAME = 32;
private const int CCHFORMNAME = 32; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=CCHDEVICENAME)]
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 DMDO dmDisplayOrientation;
public int dmDisplayFixedOutput; public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=CCHFORMNAME)]
public string dmFormName;
public short dmLogPixels;
public int 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;
} [DllImport("user32.dll", CharSet=CharSet.Auto)]
//static extern int ChangeDisplaySettings( DEVMODE lpDevMode, int dwFlags); static extern int ChangeDisplaySettings( [In] ref DEVMODE lpDevMode, int dwFlags);
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
} #region Windows Form Designer generated code
private void InitializeComponent()
{
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Text = "改变屏幕分辨率的例子"; }
#endregion static void Main()
{
Form1 r = new Form1();
r.ChangeRes();
Application.Run(new Form1());
} void ChangeRes()
{
Form1 t = new Form1();
long RetVal=0;
DEVMODE dm = new DEVMODE();
dm.dmSize= (short)Marshal.SizeOf(typeof(DEVMODE));
dm.dmPelsWidth = 1024;
dm.dmPelsHeight= 768;
dm.dmDisplayFrequency=85;
dm.dmFields = DEVMODE.DM_PELSWIDTH | DEVMODE.DM_PELSHEIGHT | DEVMODE.DM_DISPLAYFREQUENCY;
RetVal = ChangeDisplaySettings(ref dm, 0);
}
}
}