获取窗口监视器的唯一标识符

Get unique identifier for Windows monitors

本文关键字:唯一 标识符 监视器 窗口 获取      更新时间:2023-10-16

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

重新启动计算机后,枚举显示设备似乎返回不同的设备订单。还有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;
}

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

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