获取Windows监视器的唯一标识符

时间:2018-05-14 12:17:15

标签: c++ winapi

我有一个设置有两个常规显示器和三个连接到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 个答案:

答案 0 :(得分:3)

带有EnumDisplayDevices标志的

EDD_GET_DEVICE_INTERFACE_NAME应该为您提供可用的字符串。如果没有,您可以将此字符串与SetupAPI一起使用,以获取硬件ID或驱动程序密钥或任何足够独特的内容。

  

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