【问题标题】:Get unique identifier for Windows monitors获取 Windows 监视器的唯一标识符
【发布时间】:2018-05-14 12:17:14
【问题描述】:

我有两个常规显示器和三个连接到 Windows pc 的投影仪的设置。在我的 win32 程序中我需要唯一标识每台显示器并为每台显示器存储信息,以便即使在计算机重新启动后我也可以检索存储的信息。

EnumDisplayDevices 似乎在重新启动计算机后返回了不同的设备命令。还有GetPhysicalMonitorsFromHMONITOR,它至少给了我显示器的名字。但是,我的投影仪需要序列号之类的东西,因为它们是同一型号。我怎样才能得到这样一个唯一的标识符?

编辑:这是我在阅读用户Anders 的答案后提出的解决方案(谢谢!):

DISPLAY_DEVICEA dispDevice;
ZeroMemory(&dispDevice, sizeof(dispDevice));
dispDevice.cb = sizeof(dispDevice);

DWORD screenID;
while (EnumDisplayDevicesA(NULL, screenID, &dispDevice, 0))
{
    // important: make copy of DeviceName
    char name[sizeof(dispDevice.DeviceName)];
    strcpy(name, dispDevice.DeviceName);

    if (EnumDisplayDevicesA(name, 0, &dispDevice, EDD_GET_DEVICE_INTERFACE_NAME))
    {
        // at this point dispDevice.DeviceID contains a unique identifier for the monitor
    }

    ++screenID;
}

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    EnumDisplayDevicesEDD_GET_DEVICE_INTERFACE_NAME 标志应该给你一个可用的字符串。如果没有,您可以将此字符串与 SetupAPI 一起使用,以获取硬件 ID 或驱动程序密钥或任何对您的目的而言足够独特的内容。

    将此标志设置为 EDD_GET_DEVICE_INTERFACE_NAME (0x00000001) 以检索 GUID_DEVINTERFACE_MONITOR 的设备接口名称,该名称由操作系统基于每个监视器注册。该值放置在 lpDisplayDevice 中返回的 DISPLAY_DEVICE 结构的 DeviceID 成员中。生成的设备接口名称可以与 SetupAPI 函数一起使用,并用作 GDI 监控设备和 SetupAPI 监控设备之间的链接。

    【讨论】:

    • 对我来说,当我提供EDD_GET_DEVICE_INTERFACE_NAME 时,DeviceID 就会变成空的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多