首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用WinAPI/C#获取监视器/显示设备名称

要使用WinAPI/C#获取监视器/显示设备名称,您可以使用以下方法:

  1. 使用EnumDisplayDevices函数枚举所有显示设备。
  2. 使用GetMonitorInfo函数获取显示设备的详细信息。

以下是一个示例代码:

代码语言:csharp
复制
using System;
using System.Runtime.InteropServices;

public class DisplayDevice
{
    public string DeviceName { get; set; }
    public string DeviceString { get; set; }
    public bool IsPrimary { get; set; }

    public DisplayDevice(string deviceName, string deviceString, bool isPrimary)
    {
        DeviceName = deviceName;
        DeviceString = deviceString;
        IsPrimary = isPrimary;
    }
}

public class MonitorInfo
{
    public const int CCHDEVICENAME = 32;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct MONITORINFOEX
    {
        public int cbSize;
        public RECT rcMonitor;
        public RECT rcWork;
        public int dwFlags;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
        public string szDevice;
    }

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

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFOEX lpmi);

    public static DisplayDevice[] GetDisplayDevices()
    {
        var devices = new System.Collections.Generic.List<DisplayDevice>();
        uint deviceIndex = 0;
        DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE();
        displayDevice.cb = Marshal.SizeOf(displayDevice);

        while (EnumDisplayDevices(null, deviceIndex, ref displayDevice, 0))
        {
            devices.Add(new DisplayDevice(displayDevice.DeviceName, displayDevice.DeviceString, displayDevice.StateFlags.HasFlag(DisplayDeviceStateFlags.PrimaryDevice)));
            deviceIndex++;
            displayDevice.cb = Marshal.SizeOf(displayDevice);
        }

        return devices.ToArray();
    }

    public static string GetMonitorName(IntPtr hMonitor)
    {
        var monitorInfo = new MONITORINFOEX();
        monitorInfo.cbSize = Marshal.SizeOf(monitorInfo);
        GetMonitorInfo(hMonitor, ref monitorInfo);
        return monitorInfo.szDevice;
    }
}

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

[Flags()]
public enum DisplayDeviceStateFlags : int
{
    None = 0x0,
    AttachedToDesktop = 0x1,
    MultiDriver = 0x2,
    PrimaryDevice = 0x4,
    MirroringDriver = 0x8,
    VGACompatible = 0x10,
    Removable = 0x20,
    Disconnect = 0x2000000,
    Remote = 0x4000000,
    ModeChanged = 0x8000000
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

使用示例:

代码语言:csharp
复制
var displayDevices = MonitorInfo.GetDisplayDevices();
foreach (var displayDevice in displayDevices)
{
    Console.WriteLine($"Device Name: {displayDevice.DeviceName}");
    Console.WriteLine($"Device String: {displayDevice.DeviceString}");
    Console.WriteLine($"Is Primary: {displayDevice.IsPrimary}");
}

这将输出所有显示设备的名称、字符串和是否为主显示设备。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WMI-Win32_VideoController 显卡参数

AcceleratorCapabilities --图形和视频控制器的三维阵列的能力 AdapterCompatibility --用于此控制器与系统比较兼容性一般芯片组 AdapterDACType --姓名或数字 - 模拟转换器(DAC)芯片的标识符 AdapterRAM --视频适配器的内存大小 Availability --可用性和设备的状态 CapabilityDescriptions --自由形式字符串提供更详细的解释中的任何加速器能力阵列所指示的视频加速器功能 Caption --对象的简短描述 ColorTableEntries --尺寸系统的色表 ConfigManagerErrorCode --Win32的配置管理器错误代码 ConfigManagerUserConfig --如果为TRUE,该装置是使用用户定义的配置 CreationClassName --第一个具体类的名称出现在创建实例所使用的继承链 CurrentBitsPerPixel --使用的比特数以显示每个像素 CurrentHorizontalResolution --水平像素的当前数量 CurrentNumberOfColors --在当前的分辨率支持的色彩数目 CurrentNumberOfColumns --此视频控制器列(如果在字符模式下)编号 CurrentNumberOfRows --此视频控制器行(如果在字符模式下)编号 CurrentRefreshRate --频率在该视频控制器刷新监视器的图像 CurrentScanMode --当前扫描模式 CurrentVerticalResolution --当前垂直像素数量 Description --描述 DeviceID --该视频控制器标识符(唯一的计算机系统) DeviceSpecificPens --目前许多设备专用笔。值0xFFFF表示设备不支持笔。 DitherType --抖动型视频控制器 DriverDate --当前已安装的视频驱动程序的最后修改日期和时间 DriverVersion --视频驱动程序的版本号 ErrorCleared --如果为真,报上一个错误代码属性中的错误现已清除 ErrorDescription --可能采取的纠正措施字符串提供有关记录在一个错误代码属性错误的详细信息 ICMIntent --应使用默认三种可能的配色方法或意图中的一个特定值 ICMMethod --处理ICM方法。对于非ICM的应用程序,这个属性决定了ICM是否已启用对于ICM的应用程序,系统将检查此属性来确定如何处理ICM支持 InfFilename --视频适配器的路径.inf文件 InfSection --Windows的视频信息所在的.inf文件 InstallDate --安装的日期 InstalledDisplayDrivers --已安装的显示设备驱动程序的名称 LastErrorCode --报告的逻辑设备上一个错误代码 MaxMemorySupported --以字节为单位支持的内存最高限额 MaxNumberControlled --可支持通过该控制器可直接寻址的实体的最大数量 MaxRefreshRate --在赫兹视频控制器的最大刷新率 MinRefreshRate --在赫兹视频控制器的最小刷新率 Monochrome --如果是TRUE,灰阶用于显示图像。 Name --标签由该对象是已知的。当子类,该属性可以被覆盖是一个关键属性。 NumberOfColorPlanes --当前一些颜色平面。如果该值不适用于当前视频的配置,输入0(零) NumberOfVideoPages --当前的分辨率和可用内存支持视频页数 PNPDeviceID --即插即用逻辑设备的播放装置识别符 PowerManagementCapabilities --逻辑设备的特定功率相关的能力阵列 PowerManagementSupported --如果为TRUE,该装置可以是电源管理(可以投入挂起模式,等等) ProtocolSupported --由控制器使用协议访问“控制”的设备 ReservedSystemPaletteEntries --系统调色板保留的条目数 SpecificationVersion --初始化数据规范的版本号(在其上的结构的基础) Status --对象的当前状态 StatusInfo --对象的当前状态详细信息 SystemCreationClassName --该作用域计算机的创建类别名称属性的值 SystemName --系统

01
领券