C#若何靜態設置屏幕分辯率。本站提示廣大學習愛好者:(C#若何靜態設置屏幕分辯率)文章只能為提供參考,不一定能成為您想要的結果。以下是C#若何靜態設置屏幕分辯率正文
上面就不煩瑣了,直接看代碼若何處理這個成績的。
起首,年夜家應當明白,如今沒有可用的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; } } } } }
為了年夜家加倍抽象地看到法式的運轉成果,上面是一個演示後果:
以上就是本文的全體內容,願望對年夜家的進修有所贊助。