Как изменить разрешение экрана? - C#

Узнай цену своей работы

Формулировка задачи:

Есть ли какая-нибудь функция для выставления разрешения экрана, а так же функция, выставляющая ближайшее приемлемое разрешение экрана с нужным соотношением?

Решение задачи: «Как изменить разрешение экрана?»

textual
Листинг программы
  1.     using System;
  2.     using System.Collections.Generic;
  3.     using System.Linq;
  4.     using System.Text;
  5.     using System.Windows;
  6.     using System.Runtime.InteropServices;
  7.     using System.ComponentModel;
  8.  
  9. namespace LibraryCMS
  10. {
  11.     public static class ScreenAPI
  12.     {
  13.         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
  14.         [return: MarshalAs(UnmanagedType.Bool)]
  15.         static extern bool EnumDisplayDevices(
  16.             [In]  string lpszDeviceName,
  17.             [In]  uint iDevNum,
  18.             [In][Out] ref DISPLAY_DEVICE lpDisplayDevice,
  19.             [In]  uint dwFlags);
  20.  
  21.         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
  22.         [return: MarshalAs(UnmanagedType.Bool)]
  23.         static extern bool EnumDisplaySettingsExW(
  24.             [In]  string lpszDeviceName,
  25.             [In]  uint iModeNum,
  26.             [Out] out DEVMODE lpDevMode,
  27.             [In]  uint dwFlags);
  28.  
  29.         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
  30.         static extern int ChangeDisplaySettingsExW(
  31.             [In] string lpszDeviceName,
  32.             [In] ref DEVMODE lpDevMode,
  33.             IntPtr hwnd,
  34.             [In]  uint dwflags,
  35.             [In]  IntPtr lParam);
  36.  
  37.         [DllImport("gdi32.dll", ExactSpelling = true, PreserveSig = true, SetLastError = true)]
  38.         static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
  39.  
  40.         [DllImport("gdi32.dll")]
  41.         static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
  42.  
  43.         [DllImport("gdi32.dll", SetLastError = true)]
  44.         static extern IntPtr CreateCompatibleDC(IntPtr hdc);
  45.  
  46.         [DllImport("gdi32.dll")]
  47.         static extern bool DeleteObject(IntPtr hObject);
  48.  
  49.         [DllImport("gdi32.dll")]
  50.         static extern IntPtr CreateBitmap(int nWidth, int nHeight, uint cPlanes, uint cBitsPerPel, IntPtr lpvBits);
  51.  
  52.         [DllImport("user32.dll")]
  53.         static extern IntPtr GetDC(IntPtr hWnd);
  54.  
  55.         [DllImport("user32.dll")]
  56.         static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
  57.  
  58.         [DllImport("gdi32.dll")]
  59.         static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);
  60.  
  61.         [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
  62.         public struct DISPLAY_DEVICE
  63.         {
  64.             public uint cb;
  65.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
  66.             public char[] DeviceName;
  67.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
  68.             public char[] DeviceString;
  69.             public int StateFlags;
  70.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
  71.             public char[] DeviceID;
  72.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
  73.             public char[] DeviceKey;
  74.         }
  75.  
  76.         // for ChangeDisplaySettingsEx:
  77.         const uint CDS_UPDATEREGISTRY = 0x1;
  78.         const uint CDS_RESET = 0x40000000;
  79.         // for EnumDisplaySettingsEx:
  80.         const uint ENUM_CURRENT_SETTINGS = uint.MaxValue;
  81.         const uint ENUM_REGISTRY_SETTINGS = uint.MaxValue - 1;
  82.  
  83.         public enum DM_ : uint
  84.         {
  85.             SPECVERSION = 0x0401,
  86.             ORIENTATION = 0x00000001,
  87.             PAPERSIZE = 0x00000002,
  88.             PAPERLENGTH = 0x00000004,
  89.             PAPERWIDTH = 0x00000008,
  90.             SCALE = 0x00000010,
  91.             POSITION = 0x00000020,
  92.             NUP = 0x00000040,
  93.             DISPLAYORIENTATION = 0x00000080,
  94.             COPIES = 0x00000100,
  95.             DEFAULTSOURCE = 0x00000200,
  96.             PRINTQUALITY = 0x00000400,
  97.             COLOR = 0x00000800,
  98.             DUPLEX = 0x00001000,
  99.             YRESOLUTION = 0x00002000,
  100.             TTOPTION = 0x00004000,
  101.             COLLATE = 0x00008000,
  102.             FORMNAME = 0x00010000,
  103.             LOGPIXELS = 0x00020000,
  104.             BITSPERPEL = 0x00040000,
  105.             PELSWIDTH = 0x00080000,
  106.             PELSHEIGHT = 0x00100000,
  107.             DISPLAYFLAGS = 0x00200000,
  108.             DISPLAYFREQUENCY = 0x00400000,
  109.             ICMMETHOD = 0x00800000,
  110.             ICMINTENT = 0x01000000,
  111.             MEDIATYPE = 0x02000000,
  112.             DITHERTYPE = 0x04000000,
  113.             PANNINGWIDTH = 0x08000000,
  114.             PANNINGHEIGHT = 0x10000000,
  115.             DISPLAYFIXEDOUTPUT = 0x20000000
  116.         }
  117.  
  118.         [StructLayout(LayoutKind.Explicit, Pack = 1, Size = 220)]
  119.         public struct DEVMODE
  120.         {
  121.             [FieldOffset(68)]
  122.             public ushort dmSize;
  123.             [FieldOffset(72)]
  124.             public DM_ dmFields;
  125.             [FieldOffset(76)]
  126.             public POINTL dmPosition;
  127.             [FieldOffset(84)]
  128.             public uint dmDisplayOrientation;
  129.             [FieldOffset(168)]
  130.             public uint dmBitsPerPel;
  131.             [FieldOffset(172)]
  132.             public uint dmPelsWidth;
  133.             [FieldOffset(176)]
  134.             public uint dmPelsHeight;
  135.             [FieldOffset(180)]
  136.             public uint dmDisplayFlags;
  137.             [FieldOffset(184)]
  138.             public uint dmDisplayFrequency;
  139.         }
  140.  
  141.         [StructLayout(LayoutKind.Sequential)]
  142.         public struct POINTL
  143.         {
  144.             public int X;
  145.             public int Y;
  146.         }
  147.  
  148.         public enum TernaryRasterOperations : uint
  149.         {
  150.             /// <summary>dest = source</summary>
  151.             SRCCOPY = 0x00CC0020,
  152.             /// <summary>dest = source OR dest</summary>
  153.             SRCPAINT = 0x00EE0086,
  154.             /// <summary>dest = source AND dest</summary>
  155.             SRCAND = 0x008800C6,
  156.             /// <summary>dest = source XOR dest</summary>
  157.             SRCINVERT = 0x00660046,
  158.             /// <summary>dest = source AND (NOT dest)</summary>
  159.             SRCERASE = 0x00440328,
  160.             /// <summary>dest = (NOT source)</summary>
  161.             NOTSRCCOPY = 0x00330008,
  162.             /// <summary>dest = (NOT src) AND (NOT dest)</summary>
  163.             NOTSRCERASE = 0x001100A6,
  164.             /// <summary>dest = (source AND pattern)</summary>
  165.             MERGECOPY = 0x00C000CA,
  166.             /// <summary>dest = (NOT source) OR dest</summary>
  167.             MERGEPAINT = 0x00BB0226,
  168.             /// <summary>dest = pattern</summary>
  169.             PATCOPY = 0x00F00021,
  170.             /// <summary>dest = DPSnoo</summary>
  171.             PATPAINT = 0x00FB0A09,
  172.             /// <summary>dest = pattern XOR dest</summary>
  173.             PATINVERT = 0x005A0049,
  174.             /// <summary>dest = (NOT dest)</summary>
  175.             DSTINVERT = 0x00550009,
  176.             /// <summary>dest = BLACK</summary>
  177.             BLACKNESS = 0x00000042,
  178.             /// <summary>dest = WHITE</summary>
  179.             WHITENESS = 0x00FF0062
  180.         }
  181.  
  182.         public static int GetScreenCount()
  183.         {
  184.             return System.Windows.Forms.Screen.AllScreens.Length;
  185.         }
  186.  
  187.         public static List<DISPLAY_DEVICE> GetAllDisplayDevices()
  188.         {
  189.             List<DISPLAY_DEVICE> listAllDevices = new List<DISPLAY_DEVICE>();
  190.             DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE();
  191.             for (uint i = 0; i < System.Windows.Forms.Screen.AllScreens.Length; i++)
  192.             {
  193.                 displayDevice.cb = 714;
  194.                 EnumDisplayDevices(System.Windows.Forms.Screen.AllScreens[i].DeviceName, i, ref displayDevice, 0);
  195.                 listAllDevices.Add(displayDevice);
  196.             }
  197.             return listAllDevices;
  198.         }
  199.  
  200.         public static DEVMODE GetCurrentScreenMode(int screenIndex)
  201.         {
  202.             DEVMODE devmode = new DEVMODE();
  203.             devmode.dmSize = (ushort)Marshal.SizeOf(typeof(DEVMODE));
  204.             EnumDisplaySettingsExW(System.Windows.Forms.Screen.AllScreens[screenIndex].DeviceName, ENUM_CURRENT_SETTINGS, out devmode, 0);
  205.             return devmode;
  206.         }
  207.  
  208.         public static List<DEVMODE> GetAllScreenMode(int screenIndex)
  209.         {
  210.             List<DEVMODE> listAllScreenMode = new List<DEVMODE>();
  211.             uint i = 0;
  212.             DEVMODE devmode = new DEVMODE();
  213.             devmode.dmSize = (ushort)Marshal.SizeOf(typeof(DEVMODE));
  214.             while (EnumDisplaySettingsExW(System.Windows.Forms.Screen.AllScreens[screenIndex].DeviceName, i, out devmode, 0))
  215.             {
  216.                 listAllScreenMode.Add(devmode);
  217.                 i++;
  218.             }
  219.             listAllScreenMode.Sort((x, y) => x.dmPelsWidth < y.dmPelsWidth ? -1 : x.dmPelsWidth > y.dmPelsWidth ? 1 : x.dmPelsHeight < y.dmPelsHeight ? -1 : x.dmPelsHeight > y.dmPelsHeight ? 1 : x.dmBitsPerPel < y.dmBitsPerPel ? -1 : x.dmBitsPerPel > y.dmBitsPerPel ? 1 : x.dmDisplayFrequency < y.dmDisplayFrequency ? -1 : x.dmDisplayFrequency > y.dmDisplayFrequency ? 1 : 0);
  220.             int k = 0;
  221.             while (k < listAllScreenMode.Count - 1)
  222.             {
  223.                 if (listAllScreenMode[k].dmPelsWidth == listAllScreenMode[k + 1].dmPelsWidth && listAllScreenMode[k].dmPelsHeight == listAllScreenMode[k + 1].dmPelsHeight && listAllScreenMode[k].dmBitsPerPel == listAllScreenMode[k + 1].dmBitsPerPel && listAllScreenMode[k].dmDisplayFrequency == listAllScreenMode[k + 1].dmDisplayFrequency)
  224.                 {
  225.                     listAllScreenMode.RemoveAt(k);
  226.                 }
  227.                 else
  228.                 {
  229.                     k++;
  230.                 }
  231.             }
  232.             return listAllScreenMode;
  233.         }
  234.  
  235.         public static void ChangeDisplaySetting(int screenIndex, DEVMODE devMode)
  236.         {
  237.             devMode.dmSize = (ushort)Marshal.SizeOf(typeof(DEVMODE));
  238.             devMode.dmFields = DM_.BITSPERPEL | DM_.PELSWIDTH | DM_.PELSHEIGHT | DM_.DISPLAYFREQUENCY;
  239.             ChangeDisplaySettingsExW(System.Windows.Forms.Screen.AllScreens[screenIndex].DeviceName, ref devMode, IntPtr.Zero, CDS_UPDATEREGISTRY, IntPtr.Zero);
  240.         }
  241.  
  242.     }
  243. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы