Получение имени монитора с помощью 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, и я не могу найти стандартный способ узнать название монитора. Есть идеи?
Благодарю.
2 ответа
Решение
После первого вызова 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 может больше подходить для того, что вы пытаетесь сделать.