10
votes

GetSystemmetrics () renvoie la mauvaise valeur pour sm_cxcreen

J'ai rencontré un problème intéressant. Au moins en Vista, GetSystemmetrics (SM_CXScreen) renvoie une valeur incorrecte lorsque les paramètres DPI de bureau ne sont pas définis à 100%. Par exemple, j'ai essayé 150% dans un écran 1366x768 et GetSystemmetrics () renvoie 911 au lieu de 1366 (et 1366 / 1,5 ~ 911)

Selon le MSDN, GetSystemmetrics (SM_CXScreen) renvoie des pixels, donc je pensais que cette valeur ne serait pas affectée par les paramètres DPI - mais c'est. Il y a donc une manière plus sûre de trouver la résolution de l'écran Vrai et non calcée?


2 commentaires

De quel type d'application appelez-vous cela? Je viens d'essayer de faire appel à l'API de C et de l'exécuter sur Vista Business à différents paramètres DPI et de différentes résolutions et cela a rapporté les pixels correctement dans chaque instance. C'est une image VMware, alors peut-être que cela provoque une différence.


C'est une application régulière et ordinaire C ++. Pas de cadres standard, juste Winmain.


3 Réponses :


10
votes

Un programme doit indiquer au système d'exploitation qu'il est informé de la DPI d'obtenir la vraie résolution lorsque vous passez 125%. C'est le mieux fait avec un manifeste, comme expliqué dans ce bibliothèque MSDN Article .


0 commentaires

6
votes

Pour vous faire connaître le fichier DPI et manifester le fichier et placer le texte suivant.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>


0 commentaires

1
votes

Avant d'obtenir les meilleures métriques de pixels correctes des fonctions telles que GetSystemmetrics ou GetClientRect, votre application doit déclarer au système d'exploitation qu'elle connaît sur DPI et ne visera donc pas tout.

Il y a eu plusieurs modifications à la manière dont il s'agit conseillé. Voir les documents MSDN pour plus de détails. P>

de Windows 10 à partir de: P>

::SetProcessDPIAware();


1 commentaires

Il est toujours recommandé d'utiliser le manifeste pour définir la prise de conscience de votre processus de DPI. Il y a trois types de sensibilisation à DPI: 1) ignorant (vous pensez que le monde est toujours 96 dpi) 2) 2) Système conscient (vous comprenez DPI mais pense que le monde est toujours le système DPI du système et ne changera jamais) 3) Per-surveillance Conscient (vous comprenez DPI et qu'il peut changer lorsque vous exécutez) SETProcessDpiAware () rend votre système de processus complet SetProcessDpiAwaRes (...) vous permet de spécifier le mode de sensibilisation de votre processus SetThreadDpiAwaReText (...) active le sous-processus. DPI Sensibilisation