【问题标题】:EnumDisplayDevices return value is Generic PnP Monitor - c#EnumDisplayDevices 返回值为 Generic PnP Monitor - c#
【发布时间】:2014-06-17 21:23:50
【问题描述】:

当我想返回它们的实际名称时,我连接了多个监视器 - 例如: LEN L192p,IBM 190p。

我看过这个问题:

How do I get the actual Monitor name? as seen in the resolution dialog

但是当我运行它时,我得到了错误的标识。它检测到我的笔记本电脑,但未检测到我正在使用的其他两个屏幕(LEN L192p、IBM 190p)并且它写道 Generic PnP Monitor 代替。

有人知道可能是什么问题吗?

这是输出:

和代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;



namespace Screens
{
    class Program
    {


        [DllImport("user32.dll")]
        public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);

        [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 DISPLAY_DEVICE
        {
            [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;
        }


        static void Main(string[] args)
        {

            var device = new DISPLAY_DEVICE();
            device.cb = Marshal.SizeOf(device);
                try
                {
                    for (uint id = 0; EnumDisplayDevices(null, id, ref device, 0); id++)
                    {
                        device.cb = Marshal.SizeOf(device);
                        EnumDisplayDevices(device.DeviceName, 0, ref device, 0);
                        device.cb = Marshal.SizeOf(device);

                        Console.WriteLine("id={0}, name={1}, devicestring={2}", id, device.DeviceName, device.DeviceString);
                        if (device.DeviceName == null || device.DeviceName == "") continue;
                    }
                    string x = Console.ReadLine();
                }






            catch (Exception ex)
            {
                Console.WriteLine(String.Format("{0}", ex.ToString()));
            }



}

【问题讨论】:

    标签: c# multiple-monitors user32


    【解决方案1】:

    发生这种情况是因为屏幕没有安装驱动程序,因此实际设备本身正在使用通用 PnP 监视器驱动程序运行。查看设备管理器,您会看到。

    我很确定如果不安装制造商提供的显示器驱动程序,就无法实现您想要实现的目标。

    【讨论】:

    • 我现在查看了设备管理器,也看到了。但是如果我查看屏幕分辨率(在控制面板中),我可以看到这些名称。有没有办法得到这些名字?
    • @user1386966 我不这么认为,至少我能找到它。
    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 2019-12-25
    • 2018-10-19
    • 2023-03-04
    • 2019-05-28
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多