程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#如何動態設置屏幕分辨率

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

編輯:關於C語言

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

首先,大家應該明確,現在沒有可用的API來給我們動態地設置屏幕分辨率,我們要實現這個需求,我們只能在C#程序中調用Win32 API 函數來解決這個問題的,這裡用C#代碼調用Win32 API 就涉及到一個問題的,即.Net 互操作性的問題,關於這個大家可以參考我的互操作性系列文章。這裡我就不過多解釋了。

我們要解決這個問題,首先大家肯定也會遇到一個經常遇到的問題,即如何獲得用戶的分辨率,對於這個問題,.Net中提供的單獨的類給我們調用,我們可以使用Screen這個類,具體看下面的示例代碼:

? 1 2 3 Screen screen = Screen.PrimaryScreen; int screenWidth= screen.Bounds.Width; int screenHeight = screen.Bounds.Height;

然後就是如何改變屏幕的分辨率呢?要更改顯示設置可以通過使用兩個 Win32 API 來完成,這兩個 API 都具有指向 DEVMODE 結構的指針,它們分別包含與顯示設置有關的所有信息:

使用 EnumDisplaySettings 讀取當前顯示設置,並枚舉所有受支持的顯示設置。

使用 ChangeDisplaySettings 切換到新的顯示設置。

第一步、我們要先定義DEVMODE 結構體,該結構的結構必須與DEVMODE的結構一致,下面是C#中對DEVMODE 結構體的定義代碼:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 // 映射 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 函數進行聲明:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // 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這兩個函數來實現動態改變屏幕分辨率,具體代碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 // 改變分辨率 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; } } } } }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved