2009-09-25 8 views
3

J'ai besoin d'un moyen de détecter par programme si le moniteur est large ou non, sous Windows. GetSystemMetrics renvoie la taille du bureau, ce qui fonctionne, mais si un utilisateur a un moniteur grand écran, par exemple, 1024x768, je vais le classer incorrectement comme non-large.Comment détecter si un moniteur est grand écran sous Windows

GetDeviceCaps a des problèmes similaires avec HORZRES et VERTRES, et même HORZSIZE et VERTSIZE donnent des résultats incorrects lorsqu'une résolution non-large est utilisée dans un moniteur large.

Y a-t-il un moyen de détecter cela de manière fiable?

+1

http://stackoverflow.com/questions/577736/how-to-obtain-the-correct-physical-size-of-the-monitor –

+0

Pourquoi voudriez-vous le savoir? – Pod

+0

Peut-être pour avertir l'utilisateur qu'il est dans un mode vidéo qui ne correspond pas au format de l'affichage. –

Répondre

0

essayer SystemInformation.PrimaryMonitorSize

+1

Cela obtient les dimensions du mode vidéo actuel. –

0

La chose sensée serait de classer les moniteurs par rapport de la largeur à la hauteur. C'est ce que je vois beaucoup de jeux de nos jours.

Si vous pouvez obtenir la largeur, alors vous pouvez probablement obtenir la hauteur. Après cela, la réponse est seulement une petite opération mathématique.

+0

Windows signale généralement la taille du mode vidéo en cours, qui ne correspond pas nécessairement au rapport d'aspect du moniteur physique. –

+0

Bon point. Cependant, j'ai récemment vu des jeux rapportant des résolutions de certian comme écran "widscreen" sur leurs arrangements visuels. Vous pourriez sûrement faire la même chose? –

+0

L'aspect standard est 4: 3 - ce que les humains aiment regarder. L'écran large est généralement 16: 9. Règle brute du pouce: Si ce n'est pas 4: 3 supposer qu'il est grand écran. Avant le grand écran, tous les modes correspondaient à la règle 4: 3. –

2

Voici une meilleure version qui ne plaisante pas avec l'EDID ou le registre. Il fait l'hypothèse (qui est à mon humble avis tout à fait précis) que la résolution maximale soutenue par l'affichage est le meilleur ajustement natif.

DEVMODEA modeInfo; 
modeInfo.dmSize = sizeof(DEVMODEA); 
modeInfo.dmDriverExtra = NULL; 
int modeNum = 0; 
int xMax = 0, yMax = 0; 
while (EnumDisplaySettingsExA(0, modeNum, &modeInfo, 0)) { 
    ++modeNum; 
    if (modeInfo.dmPelsWidth > xMax) { 
     xMax = modeInfo.dmPelsWidth; 
     yMax = modeInfo.dmPelsHeight; 
    } 
} 
cout << "Monitor aspect ratio : " << (double)xMax/yMax << "\n"; 

Cheers.