获取窗口监视器的唯一标识符
Get unique identifier for Windows monitors
我有一个设置,有两个常规显示器和三个投影仪连接到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 监视器设备之间的链接。
相关文章:
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 按唯一标识符描述数字列表
- 获取窗口监视器的唯一标识符
- 鼠标,键盘和其他HID设备的唯一标识符
- 从 Android 上的 c++ 获取唯一的设备标识符
- 没有成员作为唯一标识符的两个类实例的比较
- 在Windows中获得C 中的唯一硬件标识符
- 如何构造本地唯一标识符名称
- 在编译时生成唯一的类型标识符
- 如何将目录路径转换为唯一的数字标识符 (Linux/C++)
- 获取系统的唯一标识符(而不是MAC地址)
- 生成可以区分 ID(Foo::a()) 和 ID(Foo::b()) 的唯一标识符
- 为iOS设备创建唯一标识符
- 如何获取计算机的唯一标识符
- CRTP和唯一的持久标识符
- 如何以跨平台的方式获得(几乎)唯一的系统标识符
- 为类型分配唯一的整型标识符,编译时
- protocolbuffers-c++唯一的持久类标识符
- 缩短唯一标识符
- 通过类型标识符表示类的数字唯一标识符