2012-04-24 233 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

相關問題