C\#화면 해상 도 를 동적 으로 설정 하 는 방법

5845 단어 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;
              }
          }
        }
      }
    }
프로그램의 실행 결 과 를 더욱 구체 적 으로 보기 위해 다음 과 같은 프 리 젠 테 이 션 효 과 를 보 여 줍 니 다.

이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기