C\#화면 해상 도 를 동적 으로 설정 하 는 방법
우선,현재 화면 해상 도 를 동적 으로 설정 할 수 있 는 API 가 없다 는 것 을 명확 하 게 해 야 합 니 다.우 리 는 이 수 요 를 실현 하려 면 C\#프로그램 에서 Win 32 API 함 수 를 호출 하여 이 문 제 를 해결 할 수 밖 에 없습니다.여기 서 C\#코드 로 Win 32 API 를 호출 하면 하나의 문제,즉.NET 상호 작용 적 인 문제 와 관련 됩 니 다.이것 에 대하 여 여러분 은 나의 상호 작용 적 인 시리즈 문장 을 참고 하 실 수 있 습 니 다.여 기 는 더 이상 설명 할 수 없습니다.
우 리 는 이 문 제 를 해결 하려 면 먼저 여러분 도 자주 발생 하 는 문제 에 직면 하 게 될 것 입 니 다.즉,사용자 의 해상 도 를 어떻게 얻 는 지,이 문제 에 대해.NET 에서 제공 하 는 단독 클래스 를 우리 에 게 호출 할 수 있 습 니 다.우 리 는 Screen 이라는 종 류 를 사용 하여 아래 의 예제 코드 를 구체 적 으로 볼 수 있 습 니 다.
Screen screen = Screen.PrimaryScreen;
int screenWidth= screen.Bounds.Width;
int screenHeight = screen.Bounds.Height;
그리고 화면의 해상 도 를 어떻게 바 꿉 니까?디 스 플레이 설정 을 변경 하려 면 두 개의 Win 32 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;
}
}
}
}
}
프로그램의 실행 결 과 를 더욱 구체 적 으로 보기 위해 다음 과 같은 프 리 젠 테 이 션 효 과 를 보 여 줍 니 다.이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.