在孟子E章的"孟宪会之精彩世界"里找到一个文章,地址如下:
http://dotnet.aspx.cc/article/2l9uxy9l-mdvh-4zi3-hpn1-rpb9kv5z63ym/read.aspx
老大就是历害,在这里给出了在C#中对ChangeDisplaySettings这个API的使用,不过不知道是什么原因,我按着孟子老大的代码执行后好像屏只是闪了一下,返回值为-2说是不正确的模式。我参照了用法,添加了EnumDisplaySettings这个API,目的是获取显示器的可用设置列表,我想从这个列表里找出任何一个来进行ChangeDisplaySettings一定不会错了,按着这个思路,我写了如下的代码,编译并测试通过了。一时高兴拿来和大家分享一下,代码如下:
测试窗体的代码:
using
System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace ChangeDisplaySettingApp
... {
public partial class Form1 : 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;
public override string ToString()
...{
return string.Format("分辨率:{0}*{1};颜色质量:{2}位;刷新率:{3};", this.dmPelsWidth, this.dmPelsHeight, this.dmBitsPerPel, this.dmDisplayFrequency);
}
}
enum ChangeReturnValue
...{
DISP_CHANGE_SUCCESSFUL = 0,
DISP_CHANGE_RESTART = 1,
DISP_CHANGE_FAILED = -1,
DISP_CHANGE_BADMODE = -2,
DISP_CHANGE_NOTUPDATED = -3,
DISP_CHANGE_BADFLAGS = -4,
DISP_CHANGE_BADPARAM = -5,
DISP_CHANGE_BADDUALVIEW = -6
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern ChangeReturnValue ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern bool EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);
public Form1()
...{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
...{
DEVMODE lpDevMode = new DEVMODE();
lpDevMode.dmDriverExtra = 0;
lpDevMode.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
lpDevMode.dmDriverExtra = 0;
try
...{
int index = 0;
while (EnumDisplaySettings(null, index, ref lpDevMode))
...{
this.lstSettings.Items.Add(lpDevMode);
index++;
}
}
catch
...{
}
}
private void btnSetDiaplay_Click(object sender, EventArgs e)
...{
try
...{
DEVMODE curDevMode = new DEVMODE();
curDevMode.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
bool success = EnumDisplaySettings(null, -1, ref curDevMode);
if (success)
...{
if (this.lstSettings.SelectedIndex != -1)
...{
DEVMODE selectedMode = (DEVMODE)this.lstSettings.SelectedItem;
ChangeReturnValue retVal = ChangeDisplaySettings(ref selectedMode, 0);
if (MessageBox.Show(this, "确认这个设置吗?", "显示属性", MessageBoxButtons.OKCancel) != DialogResult.OK)
...{
ChangeReturnValue resetVal = ChangeDisplaySettings(ref curDevMode, 0);
}
}
}
}
catch
...{ }
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace ChangeDisplaySettingApp
... {
public partial class Form1 : 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;
public override string ToString()
...{
return string.Format("分辨率:{0}*{1};颜色质量:{2}位;刷新率:{3};", this.dmPelsWidth, this.dmPelsHeight, this.dmBitsPerPel, this.dmDisplayFrequency);
}
}
enum ChangeReturnValue
...{
DISP_CHANGE_SUCCESSFUL = 0,
DISP_CHANGE_RESTART = 1,
DISP_CHANGE_FAILED = -1,
DISP_CHANGE_BADMODE = -2,
DISP_CHANGE_NOTUPDATED = -3,
DISP_CHANGE_BADFLAGS = -4,
DISP_CHANGE_BADPARAM = -5,
DISP_CHANGE_BADDUALVIEW = -6
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern ChangeReturnValue ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern bool EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);
public Form1()
...{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
...{
DEVMODE lpDevMode = new DEVMODE();
lpDevMode.dmDriverExtra = 0;
lpDevMode.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
lpDevMode.dmDriverExtra = 0;
try
...{
int index = 0;
while (EnumDisplaySettings(null, index, ref lpDevMode))
...{
this.lstSettings.Items.Add(lpDevMode);
index++;
}
}
catch
...{
}
}
private void btnSetDiaplay_Click(object sender, EventArgs e)
...{
try
...{
DEVMODE curDevMode = new DEVMODE();
curDevMode.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
bool success = EnumDisplaySettings(null, -1, ref curDevMode);
if (success)
...{
if (this.lstSettings.SelectedIndex != -1)
...{
DEVMODE selectedMode = (DEVMODE)this.lstSettings.SelectedItem;
ChangeReturnValue retVal = ChangeDisplaySettings(ref selectedMode, 0);
if (MessageBox.Show(this, "确认这个设置吗?", "显示属性", MessageBoxButtons.OKCancel) != DialogResult.OK)
...{
ChangeReturnValue resetVal = ChangeDisplaySettings(ref curDevMode, 0);
}
}
}
}
catch
...{ }
}
}
}
设计器生成的代码:
namespace
ChangeDisplaySettingApp
... {
partial class Form1
...{
/**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
...{
if (disposing && (components != null))
...{
components.Dispose();
}
base.Dispose(disposing);
}
Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
/**//// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.btnGetDisplaySettings = new System.Windows.Forms.Button();
this.lstSettings = new System.Windows.Forms.ListBox();
this.btnSetDiaplay = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btnGetDisplaySettings
//
this.btnGetDisplaySettings.Location = new System.Drawing.Point(12, 12);
this.btnGetDisplaySettings.Name = "btnGetDisplaySettings";
this.btnGetDisplaySettings.Size = new System.Drawing.Size(129, 23);
this.btnGetDisplaySettings.TabIndex = 0;
this.btnGetDisplaySettings.Text = "获取显示器设置列表";
this.btnGetDisplaySettings.UseVisualStyleBackColor = true;
this.btnGetDisplaySettings.Click += new System.EventHandler(this.button1_Click);
//
// lstSettings
//
this.lstSettings.FormattingEnabled = true;
this.lstSettings.ItemHeight = 12;
this.lstSettings.Location = new System.Drawing.Point(12, 41);
this.lstSettings.Name = "lstSettings";
this.lstSettings.Size = new System.Drawing.Size(341, 268);
this.lstSettings.TabIndex = 1;
//
// btnSetDiaplay
//
this.btnSetDiaplay.Location = new System.Drawing.Point(156, 12);
this.btnSetDiaplay.Name = "btnSetDiaplay";
this.btnSetDiaplay.Size = new System.Drawing.Size(139, 23);
this.btnSetDiaplay.TabIndex = 2;
this.btnSetDiaplay.Text = "设置显示器显示属性";
this.btnSetDiaplay.UseVisualStyleBackColor = true;
this.btnSetDiaplay.Click += new System.EventHandler(this.btnSetDiaplay_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(374, 318);
this.Controls.Add(this.btnSetDiaplay);
this.Controls.Add(this.lstSettings);
this.Controls.Add(this.btnGetDisplaySettings);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btnGetDisplaySettings;
private System.Windows.Forms.ListBox lstSettings;
private System.Windows.Forms.Button btnSetDiaplay;
}
}
... {
partial class Form1
...{
/**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
...{
if (disposing && (components != null))
...{
components.Dispose();
}
base.Dispose(disposing);
}
Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
/**//// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.btnGetDisplaySettings = new System.Windows.Forms.Button();
this.lstSettings = new System.Windows.Forms.ListBox();
this.btnSetDiaplay = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btnGetDisplaySettings
//
this.btnGetDisplaySettings.Location = new System.Drawing.Point(12, 12);
this.btnGetDisplaySettings.Name = "btnGetDisplaySettings";
this.btnGetDisplaySettings.Size = new System.Drawing.Size(129, 23);
this.btnGetDisplaySettings.TabIndex = 0;
this.btnGetDisplaySettings.Text = "获取显示器设置列表";
this.btnGetDisplaySettings.UseVisualStyleBackColor = true;
this.btnGetDisplaySettings.Click += new System.EventHandler(this.button1_Click);
//
// lstSettings
//
this.lstSettings.FormattingEnabled = true;
this.lstSettings.ItemHeight = 12;
this.lstSettings.Location = new System.Drawing.Point(12, 41);
this.lstSettings.Name = "lstSettings";
this.lstSettings.Size = new System.Drawing.Size(341, 268);
this.lstSettings.TabIndex = 1;
//
// btnSetDiaplay
//
this.btnSetDiaplay.Location = new System.Drawing.Point(156, 12);
this.btnSetDiaplay.Name = "btnSetDiaplay";
this.btnSetDiaplay.Size = new System.Drawing.Size(139, 23);
this.btnSetDiaplay.TabIndex = 2;
this.btnSetDiaplay.Text = "设置显示器显示属性";
this.btnSetDiaplay.UseVisualStyleBackColor = true;
this.btnSetDiaplay.Click += new System.EventHandler(this.btnSetDiaplay_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(374, 318);
this.Controls.Add(this.btnSetDiaplay);
this.Controls.Add(this.lstSettings);
this.Controls.Add(this.btnGetDisplaySettings);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btnGetDisplaySettings;
private System.Windows.Forms.ListBox lstSettings;
private System.Windows.Forms.Button btnSetDiaplay;
}
}
程序运行时图: