Pull to refresh

Как определить все мониторы и их разрешения

Reading time 1 min
Views 26K
image
Недавно возился с нормальной инициализацией окна, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.

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
Tags:
Hubs:
+23
Comments 23
Comments Comments 23

Articles