DisplayResolutions.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace Client.Resolution
  9. {
  10. internal static class DisplayResolutions
  11. {
  12. internal static List<eSupportedResolution> DisplaySupportedResolutions = new List<eSupportedResolution>();
  13. internal static bool GetDisplayResolutions()
  14. {
  15. bool parsedOK = false;
  16. var supportedResolutions = Enum.GetNames(typeof(eSupportedResolution));
  17. try
  18. {
  19. List<string> list = new();
  20. DEVMODE vDevMode = new DEVMODE();
  21. int i = 0;
  22. while (EnumDisplaySettings(null, i, ref vDevMode))
  23. {
  24. string displayResolution = $"w{vDevMode.dmPelsWidth}h{vDevMode.dmPelsHeight}";
  25. if(supportedResolutions.Contains(displayResolution))
  26. {
  27. if (!list.Contains(displayResolution))
  28. {
  29. list.Add(displayResolution);
  30. }
  31. }
  32. i++;
  33. }
  34. if (list.Count > 0)
  35. {
  36. foreach (string displayResolution in list)
  37. {
  38. eSupportedResolution resolution;
  39. if (Enum.TryParse(displayResolution, true, out resolution))
  40. {
  41. DisplaySupportedResolutions.Add(resolution);
  42. }
  43. }
  44. }
  45. if (DisplaySupportedResolutions.Count > 0)
  46. {
  47. parsedOK = true;
  48. }
  49. }
  50. catch
  51. {
  52. parsedOK = false;
  53. }
  54. return parsedOK;
  55. }
  56. internal static bool IsSupported(int resolution)
  57. {
  58. return IsSupported(resolution.ToString());
  59. }
  60. internal static bool IsSupported(string resolution)
  61. {
  62. eSupportedResolution res;
  63. if (!Enum.TryParse(resolution, true, out res))
  64. {
  65. return false;
  66. }
  67. if(!Enum.IsDefined(typeof(eSupportedResolution), res))
  68. {
  69. return false;
  70. }
  71. return true;
  72. }
  73. [DllImport("user32.dll")]
  74. internal static extern bool EnumDisplaySettings(
  75. string deviceName, int modeNum, ref DEVMODE devMode);
  76. const int ENUM_CURRENT_SETTINGS = -1;
  77. const int ENUM_REGISTRY_SETTINGS = -2;
  78. [StructLayout(LayoutKind.Sequential)]
  79. internal struct DEVMODE
  80. {
  81. private const int CCHDEVICENAME = 0x20;
  82. private const int CCHFORMNAME = 0x20;
  83. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
  84. public string dmDeviceName;
  85. public short dmSpecVersion;
  86. public short dmDriverVersion;
  87. public short dmSize;
  88. public short dmDriverExtra;
  89. public int dmFields;
  90. public int dmPositionX;
  91. public int dmPositionY;
  92. public ScreenOrientation dmDisplayOrientation;
  93. public int dmDisplayFixedOutput;
  94. public short dmColor;
  95. public short dmDuplex;
  96. public short dmYResolution;
  97. public short dmTTOption;
  98. public short dmCollate;
  99. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
  100. public string dmFormName;
  101. public short dmLogPixels;
  102. public int dmBitsPerPel;
  103. public int dmPelsWidth;
  104. public int dmPelsHeight;
  105. public int dmDisplayFlags;
  106. public int dmDisplayFrequency;
  107. public int dmICMMethod;
  108. public int dmICMIntent;
  109. public int dmMediaType;
  110. public int dmDitherType;
  111. public int dmReserved1;
  112. public int dmReserved2;
  113. public int dmPanningWidth;
  114. public int dmPanningHeight;
  115. }
  116. }
  117. }