¿Cómo detectar la resolución de pantalla actual?


¿Cómo puedo detectar desde 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á establecido. (Ahora, cuando todo el mundo utiliza pantallas LCD, me di cuenta de que esta es 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 eso sería una buena ventaja.

Author: Prof. Falken, 2011-01-08

7 answers

  • Tamaño del monitor primario: GetSystemMetrics SM_CXSCREEN / SM_CYSCREEN (también se pueden usar GetDeviceCaps)
  • Tamaño de todos los monitores (combinados): GetSystemMetrics SM_CX/YVIRTUALSCREEN
  • Tamaño del área de trabajo (pantalla excluyendo la barra de tareas y otras barras acopladas) en el monitor primario: Parámetros del sistema Info SPI_GETWORKAREA
  • Tamaño de un monitor específico (área de trabajo y "pantalla"): GetMonitorInfo

Editar: Es importante recordar que un monitor no siempre "comienza" en 0x0 por lo que solo saber el tamaño no es suficiente para posicionar su ventana. Puede usar MonitorFromWindow para encontrar el monitor en el que está su ventana y luego llamar a GetMonitorInfo

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

 59
Author: Anders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-07 08:58:28

Es GetSystemMetrics con estos parámetros:
SM_CXSCREEN SM_CYSCREEN

Como dice (SM_CXSCREEN):

El ancho de La pantalla de la primaria mostrar monitor, en píxeles. Esto es el mismo valor obtenido llamando GetDeviceCaps de la siguiente manera: GetDeviceCaps (hdcPrimaryMonitor, HORZRES).

 5
Author: Poni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-07 23:44:47

Cuando el sistema use La virtualización DPI (Vista y superior) usando GetSystemMetrics o GetWindowRect fallará para obtener la resolución de pantalla real (obtendrá la resolución virtual) a menos que haya creado la aplicación DPI Aware.

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

 5
Author: fingeros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-26 23:15:33

Creo SystemParametersInfo puede ser útil.

Editar: Mira GetMonitorInfo también.

 3
Author: Mehrdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-07 23:41:26

MFC Ejemplo Soporte para múltiples monitores con GetSystemMetrics EnumDisplayMonitors y GetMonitorInfo

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

 3
Author: Ulterior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-22 07:22:57

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

Aquí hay una buena para situaciones en las que el usuario ha decidido ejecutar su escritorio en una resolución más baja (mala idea) o esquina casos en los que una persona decidió obtener un monitor que su el controlador de gráficos no podía aprovechar al máximo:

// get actual size of desktop
RECT actualDesktop;
GetWindowRect(GetDesktopWindow(), &actualDesktop);
 2
Author: formerBGIuser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-05 05:06:45

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

 0
Author: Petr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-13 18:49:39