C#如何動態(tài)設(shè)置屏幕分辨率
下面就不啰嗦了,直接看代碼如何解決這個(gè)問題的。
首先,大家應(yīng)該明確,現(xiàn)在沒有可用的API來給我們動態(tài)地設(shè)置屏幕分辨率,我們要實(shí)現(xiàn)這個(gè)需求,我們只能在C#程序中調(diào)用Win32 API 函數(shù)來解決這個(gè)問題的,這里用C#代碼調(diào)用Win32 API 就涉及到一個(gè)問題的,即.NET 互操作性的問題,關(guān)于這個(gè)大家可以參考我的互操作性系列文章。這里我就不過多解釋了。
我們要解決這個(gè)問題,首先大家肯定也會遇到一個(gè)經(jīng)常遇到的問題,即如何獲得用戶的分辨率,對于這個(gè)問題,.NET中提供的單獨(dú)的類給我們調(diào)用,我們可以使用Screen這個(gè)類,具體看下面的示例代碼:
Screen screen = Screen.PrimaryScreen; int screenWidth= screen.Bounds.Width; int screenHeight = screen.Bounds.Height;
然后就是如何改變屏幕的分辨率呢?要更改顯示設(shè)置可以通過使用兩個(gè) Win32 API 來完成,這兩個(gè) API 都具有指向 DEVMODE 結(jié)構(gòu)的指針,它們分別包含與顯示設(shè)置有關(guān)的所有信息:
使用 EnumDisplaySettings 讀取當(dāng)前顯示設(shè)置,并枚舉所有受支持的顯示設(shè)置。
使用 ChangeDisplaySettings 切換到新的顯示設(shè)置。
第一步、我們要先定義DEVMODE 結(jié)構(gòu)體,該結(jié)構(gòu)的結(jié)構(gòu)必須與DEVMODE的結(jié)構(gòu)一致,下面是C#中對DEVMODE 結(jié)構(gòu)體的定義代碼:
// 映射 DEVMODE 結(jié)構(gòu) // 可以參照 DEVMODE結(jié)構(gòu)的指針定義: // 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; };
第二步、在托管環(huán)境下對Win 32 函數(shù)進(jìn)行聲明:
// Win32 函數(shù)在托管環(huán)境下的聲明 public class NativeMethods { // 平臺調(diào)用的申明 [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; }
第三步、調(diào)用EnumDisplaySettings和ChangeDisplaySettings這兩個(gè)函數(shù)來實(shí)現(xiàn)動態(tài)改變屏幕分辨率,具體代碼如下:
// 改變分辨率 public ChangeResolution(int width, int height) { // 初始化 DEVMODE結(jié)構(gòu) 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("不能執(zhí)行你的請求", "信息", 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("你需要重新啟動電腦設(shè)置才能生效", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); break; } default: { MessageBox.Show("改變屏幕分辨率失敗", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); break; } } } } }
為了大家更加形象地看到程序的運(yùn)行結(jié)果,下面是一個(gè)演示效果:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
- android計(jì)算pad或手機(jī)的分辨率/像素/密度/屏幕尺寸/DPI值的方法
- 通過js判斷訪客顯示器屏幕分辨率并給出提示
- Android的單位以及屏幕分辨率詳解
- Android基礎(chǔ)之使用Fragment適應(yīng)不同屏幕和分辨率(分享)
- Js控制彈窗實(shí)現(xiàn)在任意分辨率下居中顯示
- Android加載大分辨率圖片到手機(jī)內(nèi)存中的實(shí)例方法
- JS測試顯示屏分辨率以及屏幕尺寸的方法
- js獲取電腦分辨率的思路及操作
- android實(shí)用工具類分享(獲取內(nèi)存/檢查網(wǎng)絡(luò)/屏幕高度/手機(jī)分辨率)
- JS獲取當(dāng)前網(wǎng)頁大小以及屏幕分辨率等
相關(guān)文章
C#科學(xué)繪圖之使用scottPlot繪制多個(gè)圖像
ScottPlot是基于.Net的一款開源免費(fèi)的交互式可視化庫,支持Winform和WPF等UI框架,本文主要為大家詳細(xì)介紹了如何使用scottPlot實(shí)現(xiàn)繪制多個(gè)圖像,需要的可以參考下2023-12-12C#?計(jì)算DataTime的4種時(shí)間差的方法(相差天數(shù)、相差小時(shí)、相差分鐘、相差秒)
這篇文章主要介紹了C#?計(jì)算DataTime的4種時(shí)間差(相差天數(shù)、相差小時(shí)、相差分鐘、相差秒),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法
這篇文章主要介紹了C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下2020-06-06Microsoft Expression Web 簡體中文正式版 官方下載地址
Microsoft Expression Web 簡體中文正式版 官方下載地址...2007-07-07WinForm子窗體訪問父窗體控件的實(shí)現(xiàn)方法
WinForm子窗體訪問父窗體控件的實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-03-03