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

C++ 获取Windows监视器的唯一标识符,c++,winapi,C++,Winapi,我有一个设置,两个常规显示器和三个投影仪连接到windows pc。在我的win32程序中,我需要唯一地标识每个显示器,并存储每个显示器的信息,这样即使在计算机重新启动后,我也可以检索存储的信息 重新启动计算机后,似乎会返回不同的设备订单。还有一个,它至少给了我显示器的名称。但是,我需要一个序列号,因为它们是同一型号的投影仪。如何获得这样一个唯一的标识符 编辑:这是我在阅读了用户的答案后提出的解决方案(谢谢!): EnumDisplayDevices带有EDD\u GET\u DEVICE\u

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

重新启动计算机后,似乎会返回不同的设备订单。还有一个,它至少给了我显示器的名称。但是,我需要一个序列号,因为它们是同一型号的投影仪。如何获得这样一个唯一的标识符

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


EnumDisplayDevices
带有
EDD\u GET\u DEVICE\u INTERFACE\u NAME
标志应为您提供一个可用字符串。如果没有,您可以将此字符串与SetupAPI一起使用,以获取硬件id或驱动程序密钥,或者任何对您的目的来说足够独特的内容

将此标志设置为EDD\u GET\u DEVICE\u INTERFACE\u NAME(0x00000001),以检索GUID\u DeviceInterface\u监视器的设备接口名称,该名称由操作系统按每个监视器注册。该值位于lpDisplayDevice中返回的DISPLAY\u设备结构的DeviceID成员中。生成的设备接口名称可与SetupAPI函数一起使用,并用作GDI监视器设备和SetupAPI监视器设备之间的链接


对我来说,当我提供
EDD\u GET\u DEVICE\u INTERFACE\u NAME
时,
DeviceID
就变成了空的。
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;
}