.NET 4.x Получение разрешений экрана - C#

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

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

Я пробовал получить разрешения экрана, и написал такой код: импорт функций WinAPI
Листинг программы
  1. [DllImport("user32.dll")]
  2. public static extern bool EnumDisplaySettings(
  3. string deviceName, int modeNum, ref DEVMODE devMode);
  4. const int ENUM_CURRENT_SETTINGS = -1;
  5. const int ENUM_REGISTRY_SETTINGS = -2;
  6. [StructLayout(LayoutKind.Sequential)]
  7. public struct DEVMODE
  8. {
  9. private const int CCHDEVICENAME = 0x20;
  10. private const int CCHFORMNAME = 0x20;
  11. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
  12. public string dmDeviceName;
  13. public short dmSpecVersion;
  14. public short dmDriverVersion;
  15. public short dmSize;
  16. public short dmDriverExtra;
  17. public int dmFields;
  18. public int dmPositionX;
  19. public int dmPositionY;
  20. public ScreenOrientation dmDisplayOrientation;
  21. public int dmDisplayFixedOutput;
  22. public short dmColor;
  23. public short dmDuplex;
  24. public short dmYResolution;
  25. public short dmTTOption;
  26. public short dmCollate;
  27. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
  28. public string dmFormName;
  29. public short dmLogPixels;
  30. public int dmBitsPerPel;
  31. public int dmPelsWidth;
  32. public int dmPelsHeight;
  33. public int dmDisplayFlags;
  34. public int dmDisplayFrequency;
  35. public int dmICMMethod;
  36. public int dmICMIntent;
  37. public int dmMediaType;
  38. public int dmDitherType;
  39. public int dmReserved1;
  40. public int dmReserved2;
  41. public int dmPanningWidth;
  42. public int dmPanningHeight;
  43. }
Код получения разрешения экрана:
Листинг программы
  1. DEVMODE vDevMode = new DEVMODE();
  2. int i = 0;
  3. while (EnumDisplaySettings(null, i, ref vDevMode))
  4. {
  5. ScreenResolutin.Items.Add(vDevMode.dmPelsWidth.ToString() + "x" + vDevMode.dmPelsHeight.ToString());
  6. i++;
  7. }
  8. var items = ScreenResolutin.Items.Cast<string>().Distinct().ToArray();
  9. // Очищаем comboBox
  10. ScreenResolutin.Items.Clear();
  11. // Добавляем элементы
  12. ScreenResolutin.Items.AddRange(items);
в коде я удалил повторяющиеся элементы. Данный код пишет все доступные разрешения экрана, а монитор 16:9. Возможно ли сделать так, чтобы он выводил поддерживаемые рекомендуемые разрешения экрана, как в стандартном менеджере где его менять (Windows 8.1)

Решение задачи: «.NET 4.x Получение разрешений экрана»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Windows.Forms;
  6.  
  7. namespace ListResolutions
  8. {
  9.  
  10.     class Program
  11.     {
  12.  
  13.         static void Main(string[] args)
  14.         {
  15.             var vDevModes = Monitor.GetDevmodes();
  16.             Console.WriteLine(vDevModes.Count);
  17.             foreach (var vDevMode in vDevModes)
  18.             {
  19.                 Console.WriteLine("Width:{0} Height:{1} Color:{2} Frequency:{3}",
  20.                                         vDevMode.dmPelsWidth,
  21.                                         vDevMode.dmPelsHeight,
  22.                                         1 << vDevMode.dmBitsPerPel, vDevMode.dmDisplayFrequency
  23.                                     );
  24.             }
  25.  
  26.             Console.WriteLine();
  27.             Console.WriteLine("Recommended parameters: ");
  28.  
  29.             var best = vDevModes[vDevModes.Count - 1];
  30.             double proportions = (double) best.dmPelsWidth/best.dmPelsHeight;
  31.            
  32.             var results = vDevModes.Where(d => Math.Abs(((double) d.dmPelsWidth/d.dmPelsHeight) - proportions) <= double.Epsilon)
  33.                                    .GroupBy(d => d.dmPelsWidth*d.dmPelsHeight)
  34.                                    .Select(g => g.OrderByDescending(d => d.dmBitsPerPel).ThenBy(d => d.dmDisplayFrequency).First());
  35.             foreach (var vDevMode in results)
  36.             {
  37.                 Console.WriteLine("Width:{0} Height:{1} Color:{2} Frequency:{3}",
  38.                                         vDevMode.dmPelsWidth,
  39.                                         vDevMode.dmPelsHeight,
  40.                                         1 << vDevMode.dmBitsPerPel, vDevMode.dmDisplayFrequency
  41.                                     );
  42.             }
  43.         }
  44.     }
  45.  
  46.     public static class Monitor
  47.     {
  48.         [DllImport("user32.dll")]
  49.         public static extern bool EnumDisplaySettings(
  50.               string deviceName, int modeNum, ref DEVMODE devMode);
  51.         const int ENUM_CURRENT_SETTINGS = -1;
  52.  
  53.         const int ENUM_REGISTRY_SETTINGS = -2;
  54.  
  55.         [StructLayout(LayoutKind.Sequential)]
  56.         public struct DEVMODE
  57.         {
  58.  
  59.             private const int CCHDEVICENAME = 0x20;
  60.             private const int CCHFORMNAME = 0x20;
  61.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
  62.             public string dmDeviceName;
  63.             public short dmSpecVersion;
  64.             public short dmDriverVersion;
  65.             public short dmSize;
  66.             public short dmDriverExtra;
  67.             public int dmFields;
  68.             public int dmPositionX;
  69.             public int dmPositionY;
  70.             public ScreenOrientation dmDisplayOrientation;
  71.             public int dmDisplayFixedOutput;
  72.             public short dmColor;
  73.             public short dmDuplex;
  74.             public short dmYResolution;
  75.             public short dmTTOption;
  76.             public short dmCollate;
  77.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
  78.             public string dmFormName;
  79.             public short dmLogPixels;
  80.             public int dmBitsPerPel;
  81.             public int dmPelsWidth;
  82.             public int dmPelsHeight;
  83.             public int dmDisplayFlags;
  84.             public int dmDisplayFrequency;
  85.             public int dmICMMethod;
  86.             public int dmICMIntent;
  87.             public int dmMediaType;
  88.             public int dmDitherType;
  89.             public int dmReserved1;
  90.             public int dmReserved2;
  91.             public int dmPanningWidth;
  92.             public int dmPanningHeight;
  93.         }
  94.  
  95.         private static readonly Lazy<IReadOnlyList<DEVMODE>> DevModes = new Lazy<IReadOnlyList<DEVMODE>>(ValueFactory);
  96.  
  97.         private static IReadOnlyList<DEVMODE> ValueFactory()
  98.         {
  99.             var list = new List<DEVMODE>(100);
  100.             var vDevMode = new DEVMODE();
  101.             for (int i = 0; EnumDisplaySettings(null, i, ref vDevMode); i++)
  102.             {
  103.                 list.Add(vDevMode);
  104.             }
  105.             list.Sort((d1, d2) =>
  106.                       {
  107.                           int color = d1.dmBitsPerPel.CompareTo(d2.dmBitsPerPel);
  108.                           if (color != 0)
  109.                               return color;
  110.                           var resolution = (d1.dmPelsWidth*d1.dmPelsHeight).CompareTo(d2.dmPelsWidth*d2.dmPelsHeight);
  111.                           if (resolution != 0)
  112.                               return resolution;
  113.                           return d1.dmDisplayFrequency.CompareTo(d2.dmDisplayFrequency);
  114.                       });
  115.             return list.AsReadOnly();
  116.         }
  117.  
  118.         public static IReadOnlyList<DEVMODE> GetDevmodes()
  119.         {
  120.             return DevModes.Value;
  121.         }
  122.     }
  123. }

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


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

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

9   голосов , оценка 4 из 5

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

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

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