国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#如何動態設置屏幕分辨率

2019-10-29 21:30:06
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了C#動態設置屏幕分辨率的方法,我們可以使用Screen類設置屏幕分辨率,感興趣的小伙伴們可以參考一下
 

下面就不啰嗦了,直接看代碼如何解決這個問題的。

首先,大家應該明確,現在沒有可用的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;              }          }        }      }    }

為了大家更加形象地看到程序的運行結果,下面是一個演示效果:

C#,屏幕分辨率

以上就是本文的全部內容,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蒙阴县| 志丹县| 历史| 曲麻莱县| 鹰潭市| 大邑县| 青龙| 德清县| 威信县| 云龙县| 雷山县| 安康市| 天柱县| 东方市| 榆林市| 大安市| 南召县| 长葛市| 绥宁县| 朝阳市| 淳化县| 仙游县| 子长县| 临洮县| 土默特左旗| 红原县| 区。| 景洪市| 紫云| 三亚市| 将乐县| 朝阳区| 合水县| 虞城县| SHOW| 政和县| 德钦县| 甘洛县| 宝兴县| 始兴县| 汉寿县|