web-dev-qa-db-fra.com

Comment détecter la résolution d'écran actuelle?

Comment puis-je à partir de Winapi (en C ou C++) détecter la résolution d'écran actuelle?

Quelques antécédents:

Je veux démarrer une nouvelle fenêtre plein écran OpenGL, mais je veux qu'elle s'ouvre avec la même taille horizontale et verticale que celle sur laquelle le bureau est déjà configuré. (Maintenant, quand tout le monde utilise LCD, j'ai pensé que c'était la meilleure façon d'obtenir la résolution native de l'écran.)

Je n'ai pas désespérément besoin de connaître également la profondeur de couleur du bureau, bien que ce soit un bon bonus.

36
Prof. Falken
  • Taille du moniteur principal: GetSystemMetrics SM_CXSCREEN/SM_CYSCREEN (GetDeviceCaps peut également être utilisé)
  • Taille de tous les moniteurs (combinés): GetSystemMetrics SM_CX/YVIRTUALSCREEN
  • Taille de la zone de travail (écran hors barre des tâches et autres barres ancrées) sur le moniteur principal: SystemParametersInfo SPI_GETWORKAREA
  • Taille d'un moniteur spécifique (zone de travail et "écran"): GetMonitorInfo

Edit: Il est important de se rappeler qu'un moniteur ne "commence" pas toujours à 0x0, donc il ne suffit pas de connaître la taille pour positionner votre fenêtre. Vous pouvez utiliser MonitorFromWindow pour trouver le moniteur sur lequel se trouve votre fenêtre, puis appeler GetMonitorInfo

Si vous souhaitez emprunter la route de bas niveau ou modifier la résolution dont vous avez besoin pour utiliser EnumDisplayDevices, EnumDisplaySettings et ChangeDisplaySettings (C'est le seul moyen d'obtenir le taux de rafraîchissement AFAIK, mais GetDeviceCaps vous indiquera la profondeur de couleur)

68
Anders

Lorsque le système utilise virtualisation DPI (Vista et supérieur) à l'aide de GetSystemMetrics ou GetWindowRect échouera pour obtenir la résolution d'écran réelle (vous obtenir la résolution virtuelle) sauf si vous avez créé DPI Aware Application .

Donc, la meilleure option ici (simple et rétrocompatible) est d'utiliser EnumDisplaySettings avec ENUM_CURRENT_SETTINGS.

6
fingeros

C'est GetSystemMetrics avec ces paramètres:
SM_CXSCREEN <largeur
SM_CYSCREEN <hauteur

Comme il est dit (SM_CXSCREEN):

Largeur de l'écran du moniteur d'affichage principal, en pixels. Il s'agit de la même valeur obtenue en appelant GetDeviceCaps comme suit: GetDeviceCaps (hdcPrimaryMonitor, HORZRES).

5
Poni

Je pense que SystemParametersInfo pourrait être utile.

Edit: Regardez également GetMonitorInfo .

3
Mehrdad

Exemple MFC Prise en charge de plusieurs moniteurs avec GetSystemMetrics EnumDisplayMonitors et GetMonitorInfo

Suivez ce lien: Surveiller l'énumération avec le code source

3
Ulterior

Supprimé il y a environ une semaine, puis modifié le 3-4-13.

En voici un bon pour les situations où l'utilisateur a décidé d'exécuter son bureau dans une résolution inférieure (mauvaise idée) ou les cas de coin où une personne a décidé d'obtenir un moniteur dont son contrôleur graphique ne pouvait pas tirer pleinement parti:

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

J'utilise la fonction GetSystemMetrics

GetSystemMetrics (SM_CXSCREEN) renvoie la largeur d'écran (en pixels)

GetSystemMetrics (SM_CYSCREEN) - hauteur en pixels

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

0
Petr