2013-11-19 4 views
3

У меня возникли проблемы с получением имени монитора с помощью winapi. В соответствии с другими записями на StackOverflow, правильный способ получить имя монитора заключается в следующем:Получите имя монитора

EnumDisplayDevices(nullptr, 0, &oDisplayDevice, 0); 

char lpszDeviceName[32]; 
memcpy(lpszDeviceName, oDisplayDevice.DeviceName, 32); 

EnumDisplayDevices(lpszDeviceName, 0, &oDisplayDevice, 0); 

char lpszMonitorName[128]; 
memcpy(lpszMonitorName, oDisplayDevice.DeviceString, 128); 

Однако EnumDisplayDevices возвращает FALSE во второй раз. В первый раз DeviceName является \\DISPLAY1 и DeviceString является поставщиком графического процессора. Использование структуры MONITORINFOEX дает мне то же значение, что и DeviceName.

Чтобы быть ясным, я ищу что-то вроде «Samsung blah blah» или того, что появляется на панели управления на странице разрешения экрана.

+0

Вы инициализируете 'oDisplayDevice.cb'' sizeof (oDisplayDevice) '? –

+0

Да - я даже Zero'd память и переназначил его между вызовами, и он все еще не работает. – NmdMystery

ответ

2

Это, кажется, возвращает правильные данные для меня:

#include <Windows.h> 
#include <iostream> 
#include <string> 

int main() 
{ 
    DISPLAY_DEVICE dd; 
    dd.cb = sizeof(dd); 
    int deviceIndex = 0; 
    while(EnumDisplayDevices(0, deviceIndex, &dd, 0)) 
    { 
     std::string deviceName = dd.DeviceName; 
     int monitorIndex = 0; 
     while(EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0)) 
     { 
      std::cout << dd.DeviceName << ", " << dd.DeviceString << "\n"; 
      ++monitorIndex; 
     } 
     ++deviceIndex; 
    } 
    return 0; 
} 

Если вы собираете для UNICODE, то используйте вместо этого:

#include <Windows.h> 
#include <iostream> 
#include <string> 

int main() 
{ 
    DISPLAY_DEVICE dd; 
    dd.cb = sizeof(dd); 
    int deviceIndex = 0; 
    while(EnumDisplayDevices(0, deviceIndex, &dd, 0)) 
    { 
     std::wstring deviceName = dd.DeviceName; 
     int monitorIndex = 0; 
     while(EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0)) 
     { 
      std::wcout << dd.DeviceName << L", " << dd.DeviceString << L"\n"; 
      ++monitorIndex; 
     } 
     ++deviceIndex; 
    } 
    return 0; 
} 

Вот пример вывода:

\. \ DISPLAY1 \ Monitor0, Dell U2410 (DP)
\. \ DISPLAY2 \ Monitor0, Dell 2407WFP-HC (Dig ital)

+0

Я до сих пор ничего не получаю. Я использую LPWSTR (или std :: wstring) и версию W функции вместо простого LPSTR, может быть поэтому? – NmdMystery

+0

Хм ... Я попытался переключиться на неширокие строки, и у меня появился общий монитор PnP, это только потому, что нет ни одной строки поставщика? – NmdMystery

+0

Я добавил пример Unicode. Для меня это возвращает те же строки, которые я вижу на панели управления дисплеем и диспетчере устройств. Предположительно, если вы используете общий драйвер для монитора, тогда он будет показывать общую строку. –

Смежные вопросы