C#使用API枚举并设置显示模式

用C#程序设置屏幕分辨率及刷新频率,程序中必须检查,不允许设置到显示器不支持的模式上,以免有可能损坏显示器(我所看到的前人的程序都未作检查)。解决方案: 用API枚举出当前显示器所支持的分辨率及刷新频率,填入列表框,然后再从中选择进行设置。

  1 None.gif //  ScreenMode.cs - 使用API枚举并设置显示模式
  2 None.gif //  Thu 2005.08.25
  3 None.gif
  4 None.gif namespace  Skyiv
  5 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
  6InBlock.gif  using System;
  7InBlock.gif  using System.Windows.Forms;
  8InBlock.gif  using System.Runtime.InteropServices;
  9InBlock.gif
 10InBlock.gif  class ScreenMode : Form
 11ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 12ExpandedSubBlockStart.gifContractedSubBlock.gif    enum DMDO dot.gif{ DEFAULT = 0, D90 = 1, D180 = 2, D270 = 3 }
 13InBlock.gif
 14InBlock.gif    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
 15InBlock.gif    struct DEVMODE
 16ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 17InBlock.gif      public  const int DM_BITSPERPEL       = 0x040000;
 18InBlock.gif      public  const int DM_PELSWIDTH        = 0x080000;
 19InBlock.gif      public  const int DM_PELSHEIGHT       = 0x100000;
 20InBlock.gif      public  const int DM_DISPLAYFREQUENCY = 0x400000;
 21InBlock.gif      private const int CCHDEVICENAME       = 32;
 22InBlock.gif      private const int CCHFORMNAME         = 32;
 23InBlock.gif
 24InBlock.gif      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
 25InBlock.gif      public string dmDeviceName;
 26InBlock.gif      public short  dmSpecVersion;
 27InBlock.gif      public short  dmDriverVersion;
 28InBlock.gif      public short  dmSize;
 29InBlock.gif      public short  dmDriverExtra;
 30InBlock.gif      public int    dmFields;
 31InBlock.gif
 32InBlock.gif      public int    dmPositionX;
 33InBlock.gif      public int    dmPositionY;
 34InBlock.gif      public DMDO   dmDisplayOrientation;
 35InBlock.gif      public int    dmDisplayFixedOutput;
 36InBlock.gif
 37InBlock.gif      public short  dmColor;
 38InBlock.gif      public short  dmDuplex;
 39InBlock.gif      public short  dmYResolution;
 40InBlock.gif      public short  dmTTOption;
 41InBlock.gif      public short  dmCollate;
 42InBlock.gif
 43InBlock.gif      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
 44InBlock.gif      public string dmFormName;
 45InBlock.gif      public short  dmLogPixels;
 46InBlock.gif      public int    dmBitsPerPel;
 47InBlock.gif      public int    dmPelsWidth;
 48InBlock.gif      public int    dmPelsHeight;
 49InBlock.gif      public int    dmDisplayFlags;
 50InBlock.gif      public int    dmDisplayFrequency;
 51InBlock.gif      public int    dmICMMethod;
 52InBlock.gif      public int    dmICMIntent;
 53InBlock.gif      public int    dmMediaType;
 54InBlock.gif      public int    dmDitherType;
 55InBlock.gif      public int    dmReserved1;
 56InBlock.gif      public int    dmReserved2;
 57InBlock.gif      public int    dmPanningWidth;
 58InBlock.gif      public int    dmPanningHeight;
 59InBlock.gif
 60InBlock.gif      public override string ToString()
 61ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 62InBlock.gif        return string.Format
 63InBlock.gif        (
 64InBlock.gif          "{0,4}×{1,-4} {2,2}Bits {3,3}Hz  {4}",
 65InBlock.gif          dmPelsWidth,
 66InBlock.gif          dmPelsHeight,
 67InBlock.gif          dmBitsPerPel,
 68InBlock.gif          dmDisplayFrequency,
 69InBlock.gif          dmDeviceName
 70InBlock.gif        );
 71ExpandedSubBlockEnd.gif      }

 72ExpandedSubBlockEnd.gif    }

 73InBlock.gif
 74InBlock.gif    [DllImport("user32.dll", CharSet = CharSet.Auto)]
 75InBlock.gif    static extern bool EnumDisplaySettings(int lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);
 76InBlock.gif
 77InBlock.gif    [DllImport("user32.dll", CharSet = CharSet.Auto)]
 78InBlock.gif    static extern int ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags);
 79InBlock.gif
 80InBlock.gif    ListBox lbxPels;
 81InBlock.gif
 82InBlock.gif    // 构造函数
 83InBlock.gif    public ScreenMode()
 84ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 85InBlock.gif      Text                   = "显示属性";
 86InBlock.gif
 87InBlock.gif      lbxPels                = new ListBox();
 88InBlock.gif      lbxPels.Parent         = this;
 89InBlock.gif      lbxPels.Dock           = DockStyle.Fill;
 90InBlock.gif      lbxPels.BeginUpdate();
 91InBlock.gif      DEVMODE DevMode        = new DEVMODE();
 92InBlock.gif      for (int i = 0; EnumDisplaySettings(0, i, ref DevMode); i++)
 93ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 94InBlock.gif        lbxPels.Items.Add(DevMode);
 95ExpandedSubBlockEnd.gif      }

 96InBlock.gif      lbxPels.EndUpdate();
 97InBlock.gif
 98InBlock.gif      Button btnSet          = new Button();
 99InBlock.gif      btnSet.Parent          = this;
100InBlock.gif      btnSet.Text            = "设置显示模式";
101InBlock.gif      btnSet.Dock            = DockStyle.Top;
102InBlock.gif      btnSet.Click          += new EventHandler(SetScrnMode);
103InBlock.gif
104InBlock.gif      Button btnGet          = new Button();
105InBlock.gif      btnGet.Parent          = this;
106InBlock.gif      btnGet.Text            = "当前显示属性";
107InBlock.gif      btnGet.Dock            = DockStyle.Top;
108InBlock.gif      btnGet.Click          += new EventHandler(GetScrnInfo);
109ExpandedSubBlockEnd.gif    }

110InBlock.gif
111InBlock.gif    // 设置显示模式
112InBlock.gif    void SetScrnMode(object sender, EventArgs e)
113ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
114InBlock.gif      if (lbxPels.SelectedItem != null)
115ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
116InBlock.gif        DEVMODE DevMode = (DEVMODE)lbxPels.SelectedItem;
117InBlock.gif        ChangeDisplaySettings(ref DevMode, 0);
118ExpandedSubBlockEnd.gif      }

119ExpandedSubBlockEnd.gif    }

120InBlock.gif
121InBlock.gif    // 当前显示属性
122InBlock.gif    void GetScrnInfo(object sender, EventArgs e)
123ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
124InBlock.gif      Screen scrn = Screen.PrimaryScreen;
125InBlock.gif      MessageBox.Show(
126InBlock.gif        string.Format
127InBlock.gif        (
128InBlock.gif          "主设备: {1}{0}设备名: {2}{0}边 界: {3}{0}工作区: {4}",
129InBlock.gif          Environment.NewLine,
130InBlock.gif          scrn.Primary,
131InBlock.gif          scrn.DeviceName,
132InBlock.gif          scrn.Bounds,
133InBlock.gif          scrn.WorkingArea
134InBlock.gif        ),
135InBlock.gif        "当前显示属性",
136InBlock.gif        MessageBoxButtons.OK,
137InBlock.gif        MessageBoxIcon.Information
138InBlock.gif      );
139ExpandedSubBlockEnd.gif    }

140InBlock.gif
141InBlock.gif    // 程序入口
142InBlock.gif    static void Main()
143ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
144InBlock.gif      Application.Run(new ScreenMode());
145ExpandedSubBlockEnd.gif    }

146ExpandedSubBlockEnd.gif  }

147ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/skyiv/archive/2005/09/19/ScreenMode.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值