Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示计数(包括禁用的显示)_C# - Fatal编程技术网

C# 显示计数(包括禁用的显示)

C# 显示计数(包括禁用的显示),c#,C#,大家好,stackoverflow.com的新用户。我不知道这里会怎么问这个问题,但我已经尽力了。已经做了很多研究,但找不到一件事来解决这个问题 示例案例: 正在尝试识别Windows 7-10系统中活动和禁用显示的计数 代码GPU[可用性]: private int MonCount; [DllImport("User32.dll")] private static extern bool EnumDisplayDevices( string l

大家好,stackoverflow.com的新用户。我不知道这里会怎么问这个问题,但我已经尽力了。已经做了很多研究,但找不到一件事来解决这个问题

示例案例: 正在尝试识别Windows 7-10系统中活动和禁用显示的计数

代码GPU[可用性]:

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

    [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;

        public DISPLAY_DEVICE(int flags)
        {
            cb = 0;
            StateFlags = flags;
            DeviceName = new string((char)32, 32);
            DeviceString = new string((char)32, 128);
            DeviceID = new string((char)32, 128);
            DeviceKey = new string((char)32, 128);
            cb = Marshal.SizeOf(this);
        }
    }
    public void MonitorCheck()
    {
        DISPLAY_DEVICE lpDisplayDevice = new DISPLAY_DEVICE(0);     // OUT
        DISPLAY_DEVICE monitor_name = new DISPLAY_DEVICE(0);        // OUT

        int devNum = 0;
        while (EnumDisplayDevices(null, devNum, ref lpDisplayDevice, 0))
        {

            listBox1.Items.Add("\ndevNum =" + devNum);
            listBox1.Items.Add("cb =" + lpDisplayDevice.cb);
            listBox1.Items.Add("DeviceID =" + lpDisplayDevice.DeviceID);
            listBox1.Items.Add("DeviceKey =" + lpDisplayDevice.DeviceKey);
            listBox1.Items.Add("DeviceName =" + lpDisplayDevice.DeviceName.Trim());
            listBox1.Items.Add("DeviceString =" + lpDisplayDevice.DeviceString.Trim());
            // Show monitor name:
            EnumDisplayDevices(lpDisplayDevice.DeviceName, 0, ref monitor_name, 0);
            listBox1.Items.Add("Monitor name =" + monitor_name.DeviceString.Trim());
            ++devNum;
        }
    }
资料来源:

返回:通过图形适配器信息连接的所有显示器。计数始终为显示适配器中可以连接的监视器数量

代码激活显示:

Screen.AllScreens.Count();
返回:活动监视器计数

问题:

如果GPU适配器有3个输出: *以上GPU[可用性]代码返回:3 (无论连接了多少个显示器。)

如果连接了2台显示器(例如:笔记本电脑显示器+外部HDMI显示器),但显示器设置设置为:仅笔记本电脑显示器(外部HDMI显示器未激活)->活动显示器代码返回:1

问题

由于连接了非活动显示器和活动显示器(笔记本电脑显示器+非活动外部显示器),如何返回2

解决方案

关于如何解决这个问题,没有什么好主意:

  • 通过扩展并简单地重做来激活所有显示:
    Screen.AllScreens.Count()
  • 想法:
    比较GPU[Availability]输出的输出,并计算所有给出任何值的值,如
    monitor\u name.DeviceString.Trim()
    (然而,我在装有NVIDIA适配器的台式机上测试了这一点:结果为空,但在笔记本电脑中英特尔HD适配器:输出总是“通用PnP监视器”,因此,这不是解决方案)。

    愚蠢的我。。。千万不要使用这三种方法来解决问题。(在论坛上,让代码在代码标签中工作似乎非常困难

    • 最大可连接显示器
    • 当前连接的显示器
    • 当前活动的显示器
    解决方案:

    嗯,似乎无法将我的代码附加到stackoverflow回复,因此: