2009-08-26 12 views
2

Dans ma demande, je reçois la résolution d'écran avec ce code:Aero manipule-t-il le DPI et la taille de l'écran? Pourquoi?

SystemInformation.PrimaryMonitorSize 

Et je reçois le DPI avec ce code:

using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero))) 
    { 
     dpiX = g.DpiX; 
     dpiY = g.DpiY; 
    } 

Cela fonctionne très bien dans la plupart des situations. Mais lorsque le code s'exécute sur une machine Vista avec Aero activé, et que l'utilisateur a configuré le moniteur pour utiliser un DPI élevé, des résultats bizarres reviennent.

Disons que l'utilisateur a mis la machine pour fonctionner à 1024 x 768 et a le DPI à 144, le code ci-dessus renvoie une résolution de 683 x 512 et un DPI de 96

Toutefois, si Aero est éteint, les résultats reviennent comme je les attendais. Que fait Aero et comment puis-je obtenir la vraie résolution et DPI?

Répondre

7

Vous devez declare your application as DPI-aware, soit dans le manifeste (préféré), soit en utilisant la fonction APIWin32. Parce que tant d'applications ne sont pas écrites correctement, Vista a ajouté la "virtualisation DPI", qui permet aux applications de prétendre qu'elles fonctionnent avec un écran "standard" de 96dpi, puis la mise à l'échelle elle-même. la mise à l'échelle. Si votre application gère correctement DPI, vous devez le dire explicitement. Sur une note de côté, vous ne devriez pas muck avec HWND_DESKTOP (qui est ce que est (HWND)0). Lorsque la composition ("Aero") est désactivée, elle représente en effet l'écran physique, donc si vous obtenez son DC et dessinez dessus, vous dessinez directement dans le framebuffer. Avec un gestionnaire de fenêtres de composition, ceci est impossible by definition. Je ne sais pas si cela affecte la mesure DPI, mais il pourrait être une meilleure idée d'utiliser le courant continu pour la fenêtre de votre application au lieu de toute façon - il ne fera pas mal/

+0

+1 Ceci est tout à fait exact. Microsoft a renoncé à essayer de demander aux développeurs de faire fonctionner correctement leurs applications avec des paramètres dpi autres que 96 dpi. Plutôt que de briser la majorité des applications si l'utilisateur choisit des dpi élevés, les développeurs ont maintenant indiqué qu'ils supportent des dpi élevés. L'utilisateur peut toujours désactiver la mise à l'échelle par programme (clic droit, onglet compatibilité) –