用C#列举显示器可用设置列表并进行设置

在孟子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-1ref 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 窗体设计器生成的代码

        
private System.Windows.Forms.Button btnGetDisplaySettings;
        
private System.Windows.Forms.ListBox lstSettings;
        
private System.Windows.Forms.Button btnSetDiaplay;
    }

}


程序运行时图:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值