【问题标题】:Available Resolutions For a specific Screen特定屏幕的可用分辨率
【发布时间】:2015-05-12 18:13:52
【问题描述】:

我的机器上可能有 2 个显示器/屏幕。 我想知道特定屏幕的所有可用分辨率(我有一个 System.Windows.Forms.Screen 类型的实例)。

我看到了以下内容: How to list available video modes using C#?

List of valid resolutions for a given Screen?

但它们都会为所有监视器提供结果,而不仅仅是特定的监视器。有什么建议么?谢谢!!!

编辑 1:

这是关于我的 2 个屏幕的信息:

【问题讨论】:

  • 基本上,我尝试按照我提供的上述 2 个链接中的说明进行操作。但是在调试时,我看到它们返回了所有显示器的所有分辨率,并且我没有看到任何属性显示当前分辨率是属于我的 Screen 实例还是另一个。

标签: c# screen resolution


【解决方案1】:

在第一个链接中,您被告知EnumDisplaySettings。花几秒钟到lookup that functionFIRST PARAMETER就是

字符串,指定显示设备的图形模式 函数将获取信息。

这是一个获取有关显示器信息的示例类。我故意省略了DEVMODE,因为你已经知道了。

public class NativeMethods
{
    [DllImport("user32.dll")]
    public static extern bool EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE devMode);
    [DllImport("user32.dll")]
    public static extern bool EnumDisplayDevices(string deviceName, int modeNum, ref DISPLAY_DEVICE displayDevice, int flags);
}


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

static class Display
{
    public static List<DISPLAY_DEVICE> GetGraphicsAdapters()
    {
        int i = 0;
        DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE();
        List<DISPLAY_DEVICE> result = new List<DISPLAY_DEVICE>();
        displayDevice.cb = Marshal.SizeOf(displayDevice);
        while (NativeMethods.EnumDisplayDevices(null, i, ref displayDevice, 1))
        {
            result.Add(displayDevice);
            i++;
        }

        return result;
    }

    public static List<DISPLAY_DEVICE> GetMonitors(string graphicsAdapter)
    {

        DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE();
        List<DISPLAY_DEVICE> result = new List<DISPLAY_DEVICE>();
        int i = 0;
        displayDevice.cb = Marshal.SizeOf(displayDevice);
        while (NativeMethods.EnumDisplayDevices(graphicsAdapter, i, ref displayDevice, 0))
        {
            result.Add(displayDevice);
            i++;
        }

        return result;
    }

    public static List<DEVMODE> GetDeviceModes(string graphicsAdapter)
    {
        int i = 0;
        DEVMODE devMode = new DEVMODE();
        List<DEVMODE> result = new List<DEVMODE>();
        while (NativeMethods.EnumDisplaySettings(graphicsAdapter, i, ref devMode))
        {
            result.Add(devMode);
            i++;
        }
        return result;
    }
}

【讨论】:

  • 嗨詹姆斯,我已经用我尝试过的代码编辑了我的问题。显示名称始终相同 - “cdd”。我什至不确定这个名字是什么,因为我拥有的 2 台显示器的名称不同。 @詹姆斯巴拉斯
  • 你仍在传递 null。 NULL 值指定正在运行调用线程的计算机上的当前显示设备。您需要先 EnumDisplayDevices。
  • 我怀疑“cdd”代表“Canonical Display Driver”(Windows 中有一个名为 cdd.dll 的系统文件,它是规范的显示驱动程序)。如果有人知道,请纠正我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
相关资源
最近更新 更多