一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#如何動態設置屏幕分辨率

C#如何動態設置屏幕分辨率

2021-11-17 14:35Learning hard C#

這篇文章主要為大家詳細介紹了C#動態設置屏幕分辨率的方法,我們可以使用Screen類設置屏幕分辨率,感興趣的小伙伴們可以參考一下

下面就不啰嗦了,直接看代碼如何解決這個問題的。

首先,大家應該明確,現在沒有可用的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 結構的指針,它們分別包含與顯示設置有關的所有信息:

使用 EnumDisplaySettings 讀取當前顯示設置,并枚舉所有受支持的顯示設置。

使用 ChangeDisplaySettings 切換到新的顯示設置。

第一步、我們要先定義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 函數進行聲明:

?
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這兩個函數來實現動態改變屏幕分辨率,具體代碼如下:

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

為了大家更加形象地看到程序的運行結果,下面是一個演示效果:

C#如何動態設置屏幕分辨率

以上就是本文的全部內容,希望對大家的學習有所幫助。

延伸 · 閱讀

精彩推薦
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
主站蜘蛛池模板: 88av视频在线观看 | 99pao在线视频精品免费 | 日本免费不卡在线一区二区三区 | 97香蕉超级碰碰碰久久兔费 | 日本高清在线看免费观看 | 色综合久久天天综合观看 | 好大用力深一点 | 精品区2区3区4区产品乱码9 | 女仆掀起蕾丝裙被打屁股作文 | 肉宠文很肉到处做1v1 | 日本在线观看视频 | 成人午夜在线视频 | 别停好爽好深好大好舒服视频 | 美女脱了内裤让男生玩屁股 | 97久久天天综合色天天综合色hd | 无码乱人伦一区二区亚洲 | 亚洲国产成人在线视频 | 日本一区二区三区四区无限 | 男人午夜剧场 | 久久精品观看 | 成人私人影院在线观看网址 | 日本免费的一级绿象 | 国产午夜精品一区二区 | www.爱情岛论坛 | 亚洲va国产日韩欧美精品色婷婷 | 双子母性本能在线观看 | 我要看逼| 免费特黄一级欧美大片 | 午夜精品久久久内射近拍高清 | 亚洲激情自拍偷拍 | 久久电影院久久国产 | 国产亚洲女在线精品 | 国产乱码一卡二卡3卡四卡 国产乱插 | 国产在线伊人 | 九九热视频免费观看 | 小柔的性放荡羞辱日记动漫 | 四虎永久网址在线观看 | 国产免费不卡视频 | 亚洲欧美优优色在线影院 | 男人j放进女人的p视频免费 | 涩涩国产精品福利在线观看 |