C#如何動態設置屏幕分辨率
做者:Learning hard html
下面就不囉嗦了,直接看代碼如何解決這個問題的。windows
首先,你們應該明確,如今沒有可用的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 結構的指針,它們分別包含與顯示設置有關的全部信息:this
使用 EnumDisplaySettings 讀取當前顯示設置,並枚舉全部受支持的顯示設置。spa
使用 ChangeDisplaySettings 切換到新的顯示設置。.net
第一步、咱們要先定義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 函數進行聲明:
code
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這兩個函數來實現動態改變屏幕分辨率,具體代碼以下:
orm
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
;
}
}
}
}
}
|
爲了你們更加形象地看到程序的運行結果,下面是一個演示效果:
以上就是本文的所有內容,但願對你們的學習有所幫助。