2012-04-24 214 views
3

我遇到了this发布,其中有人想使用EnumDisplayDevices查找其显示器的名称。使用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,我不能找出监视器名称的任何标准方式。有任何想法吗?

谢谢。

+0

FWIW,我有一个指针指向代码,可以从EDID块在http://stackoverflow.com/questions提取这个帖子/ 10237937 /寻找一个可靠的映射表格屏幕设备监测edid信息 – holtavolt 2012-04-24 17:05:07

+0

谢谢我会尝试一下现在。 – 2012-04-25 08:14:08

回答

3

第一次调用到EnumDisplayDevices DispDev.DeviceString后包含显卡的名称后第二个电话 DispDev.DeviceString包含显示器名称

另请参阅该link其他方式来得到这个信息

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; 
} 
+0

Hi Flot, 是否只有像“即插即用显示器”这样的名称才有可能,因为这就是我现在所得到的。我想要显示器的实际名称,例如我的DELL P190S。 – 2012-04-25 08:11:39

+0

您确定该驱动程序是原始的戴尔驱动程序,而不是常见的即插即用Windows驱动程序?因为我以这种方式得到了我的显示器的真实名称。 – Flot2011 2012-04-25 11:58:44

+0

在设备管理器中,它也只是显示为即插即用显示器,所以我猜不是。我认为显示器的名称来自显示器的EDID,这是不是这种情况,它只是从驱动程序获取它? – 2012-04-25 12:22:56

0

我认为Win32_DesktopMonitor可能更适合你正在尝试做的事情。

+0

不幸的是,这在XP中不被支持,所以我不能使用它。 – 2012-04-25 08:12:35