Как определить текущее разрешение экрана?
Как я из Winapi (на C или С++) обнаруживает текущее разрешение экрана?
Некоторая предыстория:
Я хочу запустить новое полноэкранное окно OpenGL, но хочу, чтобы он был открыт с тем же горизонтальным и вертикальным размером, на который уже установлен рабочий стол. (Теперь, когда все используют ЖК-экраны, я решил, что это лучший способ получить собственное разрешение экрана.)
Мне не нужно также знать глубину цвета на рабочем столе, хотя это будет хороший бонус.
Ответы
Ответ 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).
Ответ 3
Я думаю, SystemParametersInfo может быть полезно.
Изменить: посмотрите GetMonitorInfo.
Ответ 4
Пример MFC Поддержка нескольких мониторов с помощью GetSystemMetrics EnumDisplayMonitors и GetMonitorInfo
Перейдите по этой ссылке: Просмотр перечислений с исходным кодом
Ответ 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.
Ответ 7
Я использую функцию GetSystemMetrics
GetSystemMetrics (SM_CXSCREEN) возвращает ширину экрана (в пикселях)
GetSystemMetrics (SM_CYSCREEN) - высота в пикселях
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385%28v=vs.85%29.aspx