C#如何動態(tài)設(shè)置屏幕分辨率
下面就不啰嗦了,直接看代碼如何解決這個問題的。
首先,大家應(yīng)該明確,現(xiàn)在沒有可用的API來給我們動態(tài)地設(shè)置屏幕分辨率,我們要實現(xiàn)這個需求,我們只能在C#程序中調(diào)用Win32 API 函數(shù)來解決這個問題的,這里用C#代碼調(diào)用Win32 API 就涉及到一個問題的,即.NET 互操作性的問題,關(guān)于這個大家可以參考我的互操作性系列文章。這里我就不過多解釋了。
我們要解決這個問題,首先大家肯定也會遇到一個經(jīng)常遇到的問題,即如何獲得用戶的分辨率,對于這個問題,.NET中提供的單獨(dú)的類給我們調(diào)用,我們可以使用Screen這個類,具體看下面的示例代碼:
Screen screen = Screen.PrimaryScreen;
int screenWidth= screen.Bounds.Width;
int screenHeight = screen.Bounds.Height;
然后就是如何改變屏幕的分辨率呢?要更改顯示設(shè)置可以通過使用兩個 Win32 API 來完成,這兩個 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這兩個函數(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é)果,下面是一個演示效果:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
您可能感興趣的文章
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#動態(tài)創(chuàng)建button的方法
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#動態(tài)創(chuàng)建Access數(shù)據(jù)庫及密碼的方法
- 01-10C#獲取動態(tài)生成的CheckBox值
- 01-10C#實現(xiàn)將應(yīng)用程序設(shè)置為開機(jī)啟動的方法
- 01-10C#中DataGridView動態(tài)添加行及添加列的方法
- 01-10C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中
- 01-10C# WinForm快捷鍵設(shè)置技巧
- 01-10C#編程中設(shè)置程序只可被運(yùn)行一次的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子


