如何在Win32程序中获取Windows显示器的唯一持久标识符?
解决Win32程序中多显示器/投影仪的唯一识别问题
你遇到的这个问题确实很常见——靠设备顺序或者名称区分同型号外设根本不靠谱,重启后顺序乱了、名称又一样,完全没法对应之前存储的配置。不过别担心,我们可以通过获取硬件层面的唯一标识符来解决这个问题。
核心思路
EnumDisplayDevices本身其实藏着关键信息,只要你用对参数:当你第二次调用它并传入EDD_GET_DEVICE_INTERFACE_NAME标志时,返回的DISPLAY_DEVICE结构体里的DeviceID字段会包含和硬件绑定的唯一标识,这个值不会因为重启、设备插拔顺序改变而变化,完美解决同型号投影仪的区分问题。
实现代码
下面是经过验证的可行代码,我帮你整理成了规范格式:
DISPLAY_DEVICEA dispDevice; ZeroMemory(&dispDevice, sizeof(dispDevice)); dispDevice.cb = sizeof(dispDevice); DWORD screenID = 0; while (EnumDisplayDevicesA(NULL, screenID, &dispDevice, 0)) { // 必须复制DeviceName,因为下一次EnumDisplayDevices会覆盖结构体内容 char name[sizeof(dispDevice.DeviceName)]; strcpy(name, dispDevice.DeviceName); // 传入EDD_GET_DEVICE_INTERFACE_NAME标志,获取带唯一标识的设备信息 if (EnumDisplayDevicesA(name, 0, &dispDevice, EDD_GET_DEVICE_INTERFACE_NAME)) { // 这里的dispDevice.DeviceID就是你要的唯一硬件标识符 // 可以把它和你的配置信息关联存储起来 } ++screenID; }
关键细节说明
- 为什么要复制
DeviceName?因为第二次调用EnumDisplayDevicesA会直接修改传入的dispDevice结构体,所以必须先把第一次获取的设备名称存下来,不然会丢失目标设备的标识。 EDD_GET_DEVICE_INTERFACE_NAME标志的作用是让系统返回设备的硬件接口信息,其中DeviceID包含了设备的序列号或者硬件唯一标识,即使是同型号的投影仪,这个值也会不一样。- 这个
DeviceID是持久化的,电脑重启、设备重新插拔后都不会改变,完全可以用来作为设备的唯一标识存储对应配置。
内容的提问来源于stack exchange,提问作者JustABit
相关产品推荐
相关产品推荐

