c++ - 获取 Windows 监视器的唯一标识符
问题描述
我有两个常规显示器和三个连接到 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;
}
解决方案
EnumDisplayDevices
带有EDD_GET_DEVICE_INTERFACE_NAME
标志应该给你一个可用的字符串。如果没有,您可以将此字符串与 SetupAPI 一起使用,以获取硬件 ID 或驱动程序密钥或任何对您的目的而言足够独特的内容。
将此标志设置为 EDD_GET_DEVICE_INTERFACE_NAME (0x00000001) 以检索 GUID_DEVINTERFACE_MONITOR 的设备接口名称,该名称由操作系统基于每个监视器注册。该值放置在 lpDisplayDevice 中返回的 DISPLAY_DEVICE 结构的 DeviceID 成员中。生成的设备接口名称可以与 SetupAPI 函数一起使用,并用作 GDI 监控设备和 SetupAPI 监控设备之间的链接。
推荐阅读
- php - 如何在 php 控制台中创建数据库监听器
- python - 使用正则表达式从python中的字符串中搜索子字符串+整数
- ruby-on-rails - ST_LineLocatePoint 与 ST_3DDistance
- python-3.x - Bokeh Hovertool 用于图中的第二个绘图
- javascript - 如何在javascript中计算含税价格和数量
- java - 如何通过 SeleniumWebdriver 和 Java 根据 html 单击弹出窗口内的按钮
- javascript - 在 angularjs 中,有没有办法使用某种指令或功能来显示多个 div?
- javascript - jQuery 动态表搜索
- javascript - 如何在 Flask 中使用 NPM 模块?
- c# - 使用多年后更新数据库