【问题标题】:How to get supported resolution of a specific monitor?如何获得特定显示器的支持分辨率?
【发布时间】:2014-07-29 12:58:17
【问题描述】:

我看过这篇关于支持的分辨率的精彩帖子: How to list available video modes using C#?

问题是我正在运行我的 .exe 的屏幕支持的分辨率。

我有 2 个屏幕,想通过屏幕“UID”或其他一些参数来获取分辨率。

有什么办法吗?

谢谢!!

【问题讨论】:

  • 数千个Screen class 的例子,也请看右边。相关栏目
  • 你必须 pinvoke EnumDisplayDevices() 来获取你可以作为 EnumDisplaySettings() 的第一个参数传递的设备名称。
  • 我仍然没有回答我的问题(不相关)。我可以获得监视器 UID,但我不明白它应该作为参数去哪里。我在我添加的示例中看到 EnumDisplaySetting 的第一个参数为“null”。这个应该改吗?不确定 UID 是预期的“设备名称”。

标签: c# monitor screen-resolution multiple-monitors uid


【解决方案1】:

您应该使用 EnumDisplayDevices API 枚举所有显示设备,然后使用 DeviceName 作为 EnumDisplaySettings API 的第一个参数,这里是获取显示设备名称的代码:

  var displayDeviceNames = new List<string>();
  int deviceIndex = 0;
  while (true)
  {
    var deviceData = new DisplayDevice();
    deviceData.cb = Marshal.SizeOf(typeof(DisplayDevice));
    if (EnumDisplayDevices(null, deviceIndex, ref deviceData, 0) != 0)
    {
      displayDeviceNames.Add(deviceData.DeviceName);
      deviceIndex++;
    }
    else
    {
      break;
    }
  }

需要的声明:

[Flags()]
public enum DisplayDeviceStateFlags : int
{
  /// <summary>The device is part of the desktop.</summary>
  AttachedToDesktop = 0x1,
  MultiDriver = 0x2,
  /// <summary>The device is part of the desktop.</summary>
  PrimaryDevice = 0x4,
  /// <summary>Represents a pseudo device used to mirror application drawing for remoting or other purposes.</summary>
  MirroringDriver = 0x8,
  /// <summary>The device is VGA compatible.</summary>
  VGACompatible = 0x16,
  /// <summary>The device is removable; it cannot be the primary display.</summary>
  Removable = 0x20,
  /// <summary>The device has more display modes than its output devices support.</summary>
  ModesPruned = 0x8000000,
  Remote = 0x4000000,
  Disconnect = 0x2000000
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DisplayDevice
{
  [MarshalAs(UnmanagedType.U4)]
  public int cb;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
  public string DeviceName;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
  public string DeviceString;
  [MarshalAs(UnmanagedType.U4)]
  public DisplayDeviceStateFlags StateFlags;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
  public string DeviceID;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
  public string DeviceKey;
}

[DllImport("User32.dll")]
static extern int EnumDisplayDevices(string lpDevice, int iDevNum, ref DisplayDevice lpDisplayDevice, int dwFlags);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多