¿Cómo se detecta la resolución de pantalla actual?

¿Cómo puedo detectar Winapi (en C o C ++) la resolución de pantalla actual?

Algunos antecedentes:

Quiero iniciar una nueva ventana de pantalla completa de OpenGL, pero quiero que se abra con el mismo tamaño horizontal y vertical que el escritorio ya está configurado. (Ahora, cuando todo el mundo usa pantallas LCD, pensé que esta era la mejor manera de obtener la resolución nativa de la pantalla).

No necesito desesperadamente conocer también la profundidad de color del escritorio, aunque sería una buena ventaja.

  • Tamaño del monitor principal: GetSystemMetrics SM_CXSCREEN / SM_CYSCREEN (GetDeviceCaps también se puede usar)
  • Tamaño de todos los monitores (combinados): GetSystemMetrics SM_CX / YVIRTUALSCREEN
  • Tamaño del área de trabajo (pantalla que excluye la barra de tareas y otras barras acopladas) en el monitor principal: SystemParametersInfo SPI_GETWORKAREA
  • Tamaño de un monitor específico (área de trabajo y “pantalla”): GetMonitorInfo

Edición: es importante recordar que un monitor no siempre “comienza” en 0x0, por lo que simplemente conocer el tamaño no es suficiente para colocar su ventana. Puede usar MonitorFromWindow para buscar el monitor en el que se encuentra su ventana y luego llamar a GetMonitorInfo

Si desea ir a la ruta de bajo nivel o cambiar la resolución, necesita usar EnumDisplayDevices, EnumDisplaySettings y ChangeDisplaySettings (Esta es la única forma de obtener la frecuencia de actualización AFAIK, pero GetDeviceCaps le indicará la profundidad de color)

Es GetSystemMetrics con estos parámetros:
SM_CXSCREEN SM_CYSCREEN

Como dice (SM_CXSCREEN):

El ancho de la pantalla del monitor de visualización principal, en píxeles. Este es el mismo valor obtenido llamando a GetDeviceCaps de la siguiente manera: GetDeviceCaps (hdcPrimaryMonitor, HORZRES).

Cuando el sistema usa la virtualización DPI (Vista y superior) utilizando GetSystemMetrics o GetWindowRect no obtendrá la resolución de pantalla real (obtendrá la resolución virtual) a menos que haya creado la aplicación DPI Aware .

Entonces la mejor opción aquí (simple y compatible con versiones anteriores) es usar EnumDisplaySettings con ENUM_CURRENT_SETTINGS.

Creo que SystemParametersInfo podría ser útil.

Editar: mira GetMonitorInfo también.

Ejemplo MFC Compatibilidad con monitores múltiples con GetSystemMetrics EnumDisplayMonitors y GetMonitorInfo

Siga este enlace: Supervise la enumeración con el código fuente

Eliminado hace aproximadamente una semana, luego editado 3-4-13.

Esta es una buena opción para situaciones en las que el usuario ha decidido ejecutar su escritorio en una resolución más baja (mala idea) o casos de esquina donde una persona decide obtener un monitor que su controlador de gráficos no puede aprovechar al máximo:

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

Uso la función GetSystemMetrics

GetSystemMetrics (SM_CXSCREEN) devuelve el ancho de la pantalla (en píxeles)

GetSystemMetrics (SM_CYSCREEN): altura en píxeles

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