Мне нужно получить имя устройства дополнительного монитора. Однако, когда я просто пытаюсь получить имя устройства, вывод DISPLAY1, DISPLAYV1
и так далее.
Однако мне требуется имя, отображаемое при проверке разрешения экрана, например, отображаемое здесь имя:
Во-первых, я не уверен, откуда я могу получить эту строку. Читая немного, я думаю, что это friendlyname
устройства. Однако я не уверен, так как на вызов EnumDisplaySetting () давал мне Unhandled Exception: Could not access memory location
когда эта функция вызывается. Так что я не смог точно определить, что такое дружеское имя. И я считаю, что необработанное исключение вызвано неправильным выделением памяти для DISPLAY_DEVICE для driverextra в DISPLAY_DEVICE. Я считаю, что это из-за этого:
Функция завершается ошибкой, если iModeNum больше, чем индекс последнего графического режима устройства отображения.
упомянутый Вот
Также я не понял, сколько памяти нужно выделить для
DISPLAY_DEVICE-> dmDriverExtra, как уже упоминалось в той же ссылке:
Перед вызовом EnumDisplaySettings установите для элемента dmSize значение sizeof (DEVMODE) и задайте для элемента dmDriverExtra размер в байтах дополнительного пространства, доступного для получения данных частного драйвера.
Так что мой вопрос разнообразен:
1) Сколько памяти нужно выделить для dmDriverExtra?
2) Является ли friendlyname правильным параметром, который мне нужен для доступа к имени, указанному на вкладке «Отображение» в разрешении экрана. Или, если нет, какой другой параметр мне нужен?
3) Это необработанное исключение вызвано неправильным распределением памяти или есть какая-то другая причина для этого?
4) Есть ли другие способы получить доступ к friendlyname вторичного монитора?
обновленный
Я переключился на использование PhysicalMonitorAPI вместо GetMonitorInfo. Я совместил оригинальное решение с первым. Это дает более разумный вывод, чем вы ожидаете (например, «Dell UH2313» вместо «\. \ Display1»).
Технически, вы должны размещать массив мониторов вместо использования жестко закодированного массива — но я никогда не видел, где dwCount будет инициализироваться чем-то большим, чем 1.
Эта программа прекрасно компилируется в Visual Studio, но вам нужно будет связать ее с dxva2.lib, чтобы получить определения для API PhysicalMonitor.
#include <Windows.h>
#include <PhysicalMonitorEnumerationAPI.h>
#include <string>
#include <iostream>
#include <stdio.h>
BOOL __stdcall MyMonitorEnumProc
(
_In_ HMONITOR hMonitor,
_In_ HDC hdcMonitor,
_In_ LPRECT lprcMonitor,
_In_ LPARAM dwData
)
{
DWORD dwCount = 0;
std::wstring strName(L"Unknown monitor name");
PHYSICAL_MONITOR monitors[100] = {};
MONITORINFOEX info = {};
info.cbSize = sizeof(info);
if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&info))
{
strName = info.szDevice;
}
if (GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &dwCount) && (dwCount > 0) && (dwCount < ARRAYSIZE(monitors)))
{
if (GetPhysicalMonitorsFromHMONITOR(hMonitor, dwCount, monitors))
{
strName = monitors[0].szPhysicalMonitorDescription;
DestroyPhysicalMonitors(dwCount, monitors);
}
}
std::wcout << L"Monitor: " << strName << std::endl;
return TRUE;
}
void printMonitorNames()
{
EnumDisplayMonitors(NULL, NULL, MyMonitorEnumProc, NULL);
}
int _tmain(int argc, _TCHAR* argv[])
{
printMonitorNames();
return 0;
}
И стоит поспорить, что MyMonitorEnumProc будет вызван первым для основного монитора. Все остальные мониторы перечисляются далее.
Других решений пока нет …