Подтвердить что ты не робот

Как определить текущее разрешение экрана?

Как я из Winapi (на C или С++) обнаруживает текущее разрешение экрана?

Некоторая предыстория:

Я хочу запустить новое полноэкранное окно OpenGL, но хочу, чтобы он был открыт с тем же горизонтальным и вертикальным размером, на который уже установлен рабочий стол. (Теперь, когда все используют ЖК-экраны, я решил, что это лучший способ получить собственное разрешение экрана.)

Мне не нужно также знать глубину цвета на рабочем столе, хотя это будет хороший бонус.

4b9b3361

Ответ 1

  • Размер основного монитора: GetSystemMetrics SM_CXSCREEN/SM_CYSCREEN (также можно использовать GetDeviceCaps)
  • Размер всех мониторов (в сочетании): GetSystemMetrics SM_CX/YVIRTUALSCREEN
  • Размер рабочей области (экран, исключающий панель задач и другие стыковочные столбцы) на основном мониторе: SystemParametersInfo SPI_GETWORKAREA
  • Размер конкретного монитора (рабочая область и "экран" ): GetMonitorInfo

Изменить: Важно помнить, что монитор не всегда "начинает" при 0x0, поэтому просто знать размер недостаточно, чтобы разместить ваше окно. Вы можете использовать MonitorFromWindow, чтобы найти монитор, на котором установлено ваше окно, а затем вызвать GetMonitorInfo

Если вы хотите перейти на низкоуровневый маршрут или изменить разрешение, вам нужно использовать EnumDisplayDevices, EnumDisplaySettings и ChangeDisplaySettings (это единственный способ получить частоту обновления AFAIK, но GetDeviceCaps скажет вам глубину цвета)

Ответ 2

Он GetSystemMetrics с этими параметрами:
SM_CXSCREEN < ширина
SM_CYSCREEN < высота

Как говорится (SM_CXSCREEN):

Ширина экрана первичной монитора в пикселях. Это то же значение, полученное путем вызова GetDeviceCaps следующим образом: GetDeviceCaps (hdcPrimaryMonitor, HORZRES).

Ответ 5

Удалено около недели назад, затем отредактировано 3-4-13.

Здесь хороший вариант для ситуаций, когда пользователь решил запустить свой рабочий стол в более низком разрешении (плохая идея) или в углу случаев, когда лицо решило получить графический контроллер не мог в полной мере воспользоваться преимуществами:

// get actual size of desktop
RECT actualDesktop;
GetWindowRect(GetDesktopWindow(), &actualDesktop);

Ответ 6

Когда система использует виртуализация DPI (Vista и выше) с использованием GetSystemMetrics или GetWindowRect будет fail, чтобы получить реальную (вы получите виртуальное разрешение), если вы не создали приложение для доступа к DPI.

Таким образом, лучший вариант (простой и обратный совместимый) заключается в использовании EnumDisplaySettings с ENUM_CURRENT_SETTINGS.