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

в 13:52, , рубрики: c++, game development, мониторы, Программирование, метки:

image
Недавно возился с нормальной инициализацией окна + OpenGL, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.

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)
    {
      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: канает, детектит и даже юзает.

Автор: Alanir


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js