You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:36:14