Question

Dans ma demande, je reçois la résolution d'écran avec ce code:

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 est exécuté sur une machine Vista avec Aero activé et l'utilisateur a défini le moniteur à utiliser un DPI élevé, des résultats bizarres reviennent.

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

Cependant, si Aero est désactivé, les résultats reviennent que je les attendre. Qu'est-ce que Aero fait et comment puis-je obtenir la vraie résolution et DPI?

Était-ce utile?

La solution

Vous devez déclarer votre candidature comme DPI- conscients , que ce soit dans le manifeste (préféré), ou en utilisant SetProcessDPIAware Win32 fonction API. Parce que de nombreuses applications ne sont pas écrites correctement, Vista a ajouté: « virtualisation DPI », qui permet aux applications font semblant qu'ils travaillent avec un écran 96dpi « standard », et ne puis lui-même mise à l'échelle - DWM, étant un gestionnaire de fenêtre compositing, peut faire la mise à l'échelle. Si vos poignées d'application différents DPI correctement, vous devez le dire explicitement.

Sur une note de côté, vous ne devriez pas Muck avec HWND_DESKTOP (qui est ce que (HWND)0 est). Lorsque compositing ( « Aero ») est éteint, il ne représente en effet l'écran physique, donc si vous obtenez son DC et d'en tirer dessus, vous dessinez directement dans le framebuffer. Avec un gestionnaire de fenêtre compositing, cela est impossible rel="noreferrer"> par définition. 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 /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top