我如何得到实际的监视器名称? 如parsing对话框中所示

我试图抓住我的系统上显示器的友好名称。 我正在使用C#。

我试过Screen ,只是给了我//./DisplayXX 。 我也尝试了Win32_DesktopMonitorEnumDisplayDevices ,他们都给了我//./DisplayXXGeneric Monitor变体,而我知道我的显示名称是SyncMasterSM2333T

现在Windows知道这些显示器是什么,使用正确的名称将它们显示在“ 设备和打印机”窗口中,还可以在对话框中设置位置和分辨率。

我可以从哪里获得这些名字? 我看了registry,不能find他们,所以任何帮助将是伟大的。

解决scheme:我遇到的问题是第二次调用EnumDisplayDevices时,我再次将iDevNum设置为id,这意味着我试图从错误的地方获取数据,然后用0代替它,它完美地工作,请参阅下面的码。

  var device = new DISPLAY_DEVICE(); device.cb = Marshal.SizeOf(device); try { for (uint id = 0; EnumDisplayDevices(null, id, ref device, 0); id++) { Console.WriteLine(String.Format("{0}, {1}, {2}, {3}, {4}, {5}", id, device.DeviceName, device.DeviceString, device.StateFlags, device.DeviceID, device.DeviceKey)); Console.WriteLine(); device.cb = Marshal.SizeOf(device); EnumDisplayDevices(device.DeviceName, 0, ref device, 0); Console.WriteLine(String.Format("{0}, {1}, {2}, {3}, {4}, {5}", id, device.DeviceName, device.DeviceString, device.StateFlags, device.DeviceID, device.DeviceKey)); device.cb = Marshal.SizeOf(device); device.cb = Marshal.SizeOf(device); return; } } } catch (Exception ex) { Console.WriteLine(String.Format("{0}", ex.ToString())); } 

Solutions Collecting From Web of "我如何得到实际的监视器名称? 如parsing对话框中所示"

EnumDisplayDevices获得DisplayDevice.DeviceName//./DisplayX ,你应该再次调用“EnumDisplayDevices”,这次提供你从前一次调用中获得的DisplayDevice.DeviceName作为lpDevice ,而'0像iDevNum 然后,您将在DisplayDevice.DeviceString具有监视器名称。

仔细检查! 这就是你想要的,你现在可以编写Screen.PrimaryScreen.DeviceFriendlyName()并获取显示设备的真实名称。
(是的,这是在解析对话框中看到的同名)

当我添加了一些个人风格来包装这些代码时,我并没有创建它的硬核部分,所以我要感谢2位开发人员,MS开发人员在C ++中给出了必要的东西,还有一位匿名开发人员将这些基本知识到C#代码。

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.InteropServices; using System.Windows.Forms; using Tools; namespace ConsoleApplication35 { internal class Program { private static void Main() { Console.WriteLine(Screen.PrimaryScreen.DeviceFriendlyName()); //output: ASUS MK241 Console.ReadLine(); } } } namespace Tools { public static class ScreenInterrogatory { public const int ERROR_SUCCESS = 0; #region enums public enum QUERY_DEVICE_CONFIG_FLAGS : uint { QDC_ALL_PATHS = 0x00000001, QDC_ONLY_ACTIVE_PATHS = 0x00000002, QDC_DATABASE_CURRENT = 0x00000004 } public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint { DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000, DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF } public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint { DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0, DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1, DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2, DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED, DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3, DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF } public enum DISPLAYCONFIG_ROTATION : uint { DISPLAYCONFIG_ROTATION_IDENTITY = 1, DISPLAYCONFIG_ROTATION_ROTATE90 = 2, DISPLAYCONFIG_ROTATION_ROTATE180 = 3, DISPLAYCONFIG_ROTATION_ROTATE270 = 4, DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF } public enum DISPLAYCONFIG_SCALING : uint { DISPLAYCONFIG_SCALING_IDENTITY = 1, DISPLAYCONFIG_SCALING_CENTERED = 2, DISPLAYCONFIG_SCALING_STRETCHED = 3, DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4, DISPLAYCONFIG_SCALING_CUSTOM = 5, DISPLAYCONFIG_SCALING_PREFERRED = 128, DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF } public enum DISPLAYCONFIG_PIXELFORMAT : uint { DISPLAYCONFIG_PIXELFORMAT_8BPP = 1, DISPLAYCONFIG_PIXELFORMAT_16BPP = 2, DISPLAYCONFIG_PIXELFORMAT_24BPP = 3, DISPLAYCONFIG_PIXELFORMAT_32BPP = 4, DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5, DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff } public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint { DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1, DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2, DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF } public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint { DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1, DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2, DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3, DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4, DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5, DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6, DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF } #endregion #region structs [StructLayout(LayoutKind.Sequential)] public struct LUID { public uint LowPart; public int HighPart; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_PATH_SOURCE_INFO { public LUID adapterId; public uint id; public uint modeInfoIdx; public uint statusFlags; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_PATH_TARGET_INFO { public LUID adapterId; public uint id; public uint modeInfoIdx; private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; private DISPLAYCONFIG_ROTATION rotation; private DISPLAYCONFIG_SCALING scaling; private DISPLAYCONFIG_RATIONAL refreshRate; private DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; public bool targetAvailable; public uint statusFlags; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_RATIONAL { public uint Numerator; public uint Denominator; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_PATH_INFO { public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo; public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo; public uint flags; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_2DREGION { public uint cx; public uint cy; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO { public ulong pixelRate; public DISPLAYCONFIG_RATIONAL hSyncFreq; public DISPLAYCONFIG_RATIONAL vSyncFreq; public DISPLAYCONFIG_2DREGION activeSize; public DISPLAYCONFIG_2DREGION totalSize; public uint videoStandard; public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_TARGET_MODE { public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo; } [StructLayout(LayoutKind.Sequential)] public struct POINTL { private int x; private int y; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_SOURCE_MODE { public uint width; public uint height; public DISPLAYCONFIG_PIXELFORMAT pixelFormat; public POINTL position; } [StructLayout(LayoutKind.Explicit)] public struct DISPLAYCONFIG_MODE_INFO_UNION { [FieldOffset(0)] public DISPLAYCONFIG_TARGET_MODE targetMode; [FieldOffset(0)] public DISPLAYCONFIG_SOURCE_MODE sourceMode; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_MODE_INFO { public DISPLAYCONFIG_MODE_INFO_TYPE infoType; public uint id; public LUID adapterId; public DISPLAYCONFIG_MODE_INFO_UNION modeInfo; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS { public uint value; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_DEVICE_INFO_HEADER { public DISPLAYCONFIG_DEVICE_INFO_TYPE type; public uint size; public LUID adapterId; public uint id; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct DISPLAYCONFIG_TARGET_DEVICE_NAME { public DISPLAYCONFIG_DEVICE_INFO_HEADER header; public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags; public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; public ushort edidManufactureId; public ushort edidProductCodeId; public uint connectorInstance; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string monitorFriendlyDeviceName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string monitorDevicePath; } #endregion #region DLL-Imports [DllImport("user32.dll")] public static extern int GetDisplayConfigBufferSizes( QUERY_DEVICE_CONFIG_FLAGS flags, out uint numPathArrayElements, out uint numModeInfoArrayElements); [DllImport("user32.dll")] public static extern int QueryDisplayConfig( QUERY_DEVICE_CONFIG_FLAGS flags, ref uint numPathArrayElements, [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray, ref uint numModeInfoArrayElements, [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray, IntPtr currentTopologyId ); [DllImport("user32.dll")] public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName); #endregion private static string MonitorFriendlyName(LUID adapterId, uint targetId) { var deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME { header = { size = (uint)Marshal.SizeOf(typeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)), adapterId = adapterId, id = targetId, type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME } }; var error = DisplayConfigGetDeviceInfo(ref deviceName); if (error != ERROR_SUCCESS) throw new Win32Exception(error); return deviceName.monitorFriendlyDeviceName; } private static IEnumerable<string> GetAllMonitorsFriendlyNames() { uint pathCount, modeCount; var error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount); if (error != ERROR_SUCCESS) throw new Win32Exception(error); var displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount]; var displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount]; error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, ref pathCount, displayPaths, ref modeCount, displayModes, IntPtr.Zero); if (error != ERROR_SUCCESS) throw new Win32Exception(error); for (var i = 0; i < modeCount; i++) if (displayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET) yield return MonitorFriendlyName(displayModes[i].adapterId, displayModes[i].id); } public static string DeviceFriendlyName(this Screen screen) { var allFriendlyNames = GetAllMonitorsFriendlyNames(); for (var index = 0; index < Screen.AllScreens.Length; index++) if (Equals(screen, Screen.AllScreens[index])) return allFriendlyNames.ToArray()[index]; return null; } } } 

这些信息几乎肯定是通过SetupAPI系列函数获得的。 我不记得头脑中的细节,但是您需要获取所有监视器设备(GUID_DEVINTERFACE_MONITOR)并获取其友好名称(SPDRP_FRIENDLYNAME)。

我一直在回答这个问题。 在这个链接中提到了通用pnp监视器,因为没有为监视器安装驱动程序,设备正在使用通用即插即用监视器驱动程序运行。

对于Windows 7和更高版本,似乎有一个不同于EnumDisplayDevices的功能来获得所需的显示名称,如控制面板中所示。 这可以通过DisplayConfigGetDeviceInfo函数完成,如下所述。 我希望有人能够把这个翻译成德尔福,我正在寻找。

从这里: 获取精确的监视器/显示/屏幕名称

那么,这个问题是旧的,但是,为了谷歌重定向,我建议“WindowsDisplayAPI”库。

https://www.nuget.org/packages/WindowsDisplayAPI


使用库,有多种方法来获取显示名称。 最简单的方法是:

 foreach (var display in Display.GetDisplays()) { Console.WriteLine(display.DeviceName); } 

但是,这是使用旧的API,如果你确定你的程序目标至少是Windows Vista,我建议下面的代码:

 foreach (var target in DisplayConfig.PathDisplayTarget.GetDisplayTargets()) { Console.WriteLine(target.FriendlyName); }