获取Windows显示器的唯一标识符

6
我有一个与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;
}
1个回答

5
EDD_GET_DEVICE_INTERFACE_NAME标志的EnumDisplayDevices函数应该会给你一个可用的字符串。如果没有,你可以使用这个字符串与SetupAPI一起使用,以获取硬件ID或驱动程序密钥或任何对你的目的足够唯一的东西。
将此标志设置为EDD_GET_DEVICE_INTERFACE_NAME(0x00000001),以检索GUID_DEVINTERFACE_MONITOR的设备接口名称,该名称在操作系统上每个监视器基础上进行注册。该值被放置在返回的DISPLAY_DEVICE结构体中的DeviceID成员中。得到的设备接口名称可以与SetupAPI函数一起使用,并且作为GDI监视器设备和SetupAPI监视器设备之间的链接。

1
对我来说,当我提供 EDD_GET_DEVICE_INTERFACE_NAME 时,DeviceID 就变成了空的。 - Zyl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接