使用 EnumDisplayDevices 获取监视器的名称

Getting the monitor's name with EnumDisplayDevices

本文关键字:监视器 EnumDisplayDevices 获取 使用      更新时间:2023-10-16

我遇到了这篇文章,其中有人想使用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,我无法找到任何标准方法来查找显示器名称。有什么想法吗?

谢谢。

在第一次调用 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;
}

我认为Win32_DesktopMonitor可能更适合您要做的事情。