使用EnumDisplayDevices获取显示器名称

4
我在这篇文章中看到有人想使用EnumDisplayDevices查找他们的显示器名称。
这正是我想要的,我尝试在C++中做类似的事情,但第二次调用EnumDisplayDevices似乎从未返回任何内容,我只能获得关于显卡的信息。
DISPLAY_DEVICE dd;
memset(&dd, 0, sizeof(DISPLAY_DEVICE));
dd.cb = sizeof(dd);
int i = 0;
while(EnumDisplayDevices(NULL, i, &dd, 0))
{
    Log(_T("Device Name: %s Device String: %s"), dd.DeviceName, dd.DeviceString);

    if(EnumDisplayDevices(dd.DeviceName, 0, &dd, 0))
    {
        Log(_T("Monitor Name: %s Monitor String: %s"), dd.DeviceName, dd.DeviceString);
    }

    i++;
} 

我得到的输出是
Device Name: \\.\DISPLAY1 Device String: NVIDIA GeForce 9300 GE
Device Name: \\.\DISPLAYV1 Device String: NetMeeting driver
Device Name: \\.\DISPLAYV2 Device String: RDPDD Chained DD

目标平台是XP,我找不到任何标准的方法来查找显示器名称。有什么想法吗?谢谢。

顺便说一句,我有一篇帖子,其中包含指向代码的指针,可以从https://dev59.com/j2LVa4cB1Zd3GeqP0ujG中的EDID块中提取此信息。 - holtavolt
2个回答

5

第一次调用EnumDisplayDevices后,DispDev.DeviceString包含显卡名称。第二次调用后,DispDev.DeviceString包含显示器名称

此外,可以查看链接以获取其他获取此信息的方法。

BOOL GetMonitorInfo(int nDeviceIndex, LPSTR lpszMonitorInfo) {
    BOOL bResult = TRUE;
    FARPROC EnumDisplayDevices;
    HINSTANCE  hInstUserLib;
    DISPLAY_DEVICE DispDev;
    char szDeviceName[32];

    hInstUserLib = LoadLibrary("User32.DLL");

    EnumDisplayDevices = (FARPROC)GetProcAddress(hInstUserLib,
                                                 "EnumDisplayDevicesA");
    if(!EnumDisplayDevices) {
        FreeLibrary(hInstUserLib);
        return FALSE;
    }

    ZeroMemory(&DispDev, sizeof(DISPLAY_DEVICE));
    DispDev.cb = sizeof(DISPLAY_DEVICE);

    // After first call to EnumDisplayDevices DispDev.DeviceString 
    //contains graphic card name
    if(EnumDisplayDevices(NULL, nDeviceIndex, &DispDev, 0)) {
        lstrcpy(szDeviceName, DispDev.DeviceName);

        // after second call DispDev.DeviceString contains monitor's name 
        EnumDisplayDevices(szDeviceName, 0, &DispDev, 0);

        lstrcpy(lpszMonitorInfo, DispDev.DeviceString);
    }
    else {
        bResult = FALSE;
    }

    FreeLibrary(hInstUserLib);

    return bResult;
}

嗨Flot,只能获取像“即插即用监视器”这样的名称吗?因为这就是我现在得到的。我想要显示器的实际名称,例如我的是DELL P190S。 - Bill Walton
您确定驱动程序是原始的戴尔驱动程序而不是通用的 Plug&Play Windows 驱动程序吗?因为通过这种方式,我可以获得我的显示器的真实名称。 - Flot2011
在设备管理器中,它只显示为即插即用监视器,所以我猜不是。我以为显示器名称会来自显示器的EDID,这不是这种情况吗?它只是从驱动程序获取吗? - Bill Walton
还请查看我在答案中添加的链接。 - Flot2011
谢谢Flot。读取注册表不是一个选项,因为可能有很多在过去连接过的监视器,而我不知道哪一个是当前连接的。Win32_DesktopMonitor直到Vista才被引入。在XP中这样做确实很麻烦,但我会检查一下其他链接。干杯。 - Bill Walton
显示剩余2条评论

0

1
不幸的是,XP系统不支持此功能,因此我无法使用它。 - Bill Walton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接