程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#若何靜態設置屏幕分辯率

C#若何靜態設置屏幕分辯率

編輯:C#入門知識

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;
              }
          }
        }
      }
    }

為了年夜家加倍抽象地看到法式的運轉成果,上面是一個演示後果:

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved