Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.
appRet aApplication::ObtainMonitors()
{
DWORD i = 0;
DWORD j;
DISPLAY_DEVICE dc;
dc.cb = sizeof(dc);
while(EnumDisplayDevices(NULL, i, &dc, EDD_GET_DEVICE_INTERFACE_NAME) != 0)
{
if ((dc.StateFlags & DISPLAY_DEVICE_ACTIVE) && !(dc.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))
{
DEVMODE dm;
j = 0;
while(EnumDisplaySettings(dc.DeviceName, j, &dm) != 0)
{
//Запоминаем DEVMODE dm, чтобы потом мы могли его найти и использовать
//в ChangeDisplaySettings, когда будем инициализировать окно
++j;
}
}
++i;
}
if (i == 0)
return APP_NOMON;
return APP_DONE;
}
Т.к. мы заранее не знаем какие могут быть девайсы в системе, то нам придётся бегать циклами. Сначала через второй параметр функции EnumDisplayDevices мы перебираем все мониторы в текущей сессии пользователя. Потом через if (dc.StateFlags & DISPLAY_DEVICE_ACTIVE) убеждаемся что «монитор» на связи и не спит. Ну и после мы узнаём его имя в dc.DeviceName и может через EnumDisplaySettings бежать по всем доступны разрешениям этого «монитора».
Тестировал подключив к ноуту телек LG: канает, детектит и даже юзает.
UPD: Добавил в условие проверку на параметр DISPLAY_DEVICE_MIRRORING_DRIVER, чтобы отбросить вирт. устройства. Спасибо, shrikus