Как определить текущее разрешение экрана? - PullRequest
36 голосов
/ 08 января 2011

Как из Winapi (в C или C ++) определить текущее разрешение экрана?

Некоторый фон:

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

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

Ответы [ 7 ]

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

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

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

6 голосов
/ 27 декабря 2016

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

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

5 голосов
/ 08 января 2011

Это GetSystemMetrics со следующими параметрами:
SM_CXSCREEN <ширина <br> SM_CYSCREEN <высота </p>

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

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

3 голосов
/ 08 сентября 2011

Пример MFC Поддержка нескольких мониторов с GetSystemMetrics EnumDisplayMonitors и GetMonitorInfo

Перейдите по этой ссылке: Перечисление монитора с исходным кодом

3 голосов
/ 08 января 2011

Я думаю, SystemParametersInfo может быть полезным.

Редактировать: Посмотрите на GetMonitorInfo тоже.

2 голосов
/ 22 января 2013

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

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

// get actual size of desktop
RECT actualDesktop;
GetWindowRect(GetDesktopWindow(), &actualDesktop);
0 голосов
/ 13 декабря 2015

Я использую функцию GetSystemMetrics

GetSystemMetrics (SM_CXSCREEN) возвращает ширину экрана (в пикселях)

GetSystemMetrics (SM_CYSCREEN) - высота в пикселях

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385%28v=vs.85%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...