2010-04-13 16 views
8

Me he encontrado con un problema interesante. Al menos en Vista, getSystemMetrics (SM_CXSCREEN) devuelve un valor incorrecto cuando la configuración de DPI de escritorio no está configurada al 100%. Por ejemplo, he intentado 150% en una pantalla de 1366x768 y GetSystemMetrics() devuelve 911 en lugar de 1366 (y 1366/1,5 ~ 911)GetSystemMetrics() devuelve el valor incorrecto para SM_CXSCREEN

Según la MSDN, GetSystemMetrics (SM_CXSCREEN) devuelve píxeles, así que pensé este valor wouldn No se verá afectado por la configuración de DPI, pero sí lo es. Entonces, ¿hay una manera más segura de descubrir la resolución de pantalla real sin escala?

+0

¿A qué tipo de aplicación llamas? Intenté llamar a esa API desde C y ejecutarla en Vista Business en diferentes configuraciones de DPI y diferentes resoluciones e informó los píxeles correctamente en cada instancia. Es una imagen vmware, así que tal vez eso causa una diferencia. –

+0

Es una aplicación regular, sin formato de C++. Sin marcos estándar, solo WinMain. – ggambett

Respuesta

10

Un programa debe indicarle al sistema operativo que es compatible con DPI para obtener la resolución verdadera cuando pasa del 125%. Eso se hace mejor con un manifiesto, como se explica en este MSDN Library article.

+0

Eso lo hizo. ¡Gracias! – ggambett

5

Para hacer que su aplicación tenga en cuenta la creación de dpi y el archivo de manifiesto y coloque el siguiente texto en él.

<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> 
1

Antes de obtener las métricas correctas de píxeles de funciones como GetSystemMetrics, o GetClientRect, su aplicación debe declarar que el sistema operativo que se sabe sobre DPI y por lo tanto no arruine todo.

Ha habido varios cambios en cómo se recomienda esto. Consulte los documentos de MSDN para obtener más detalles.

desde Windows 10 en adelante:

::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE); 

O desde Windows 8.1 en adelante:

::SetProcessDpiAwareness(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE); 

O de Vista en adelante:

::SetProcessDPIAware(); 

Después de llamar a esto, los GetSystemMetrics de función, etc. debe devolver los valores correctos a su aplicación en píxeles.

+0

Siempre se recomienda utilizar el manifiesto para establecer el conocimiento de DPI de su proceso. Hay tres tipos de conocimiento DPI: 1) inconsciente (usted piensa que el mundo es siempre 96 DPI) 2) consciente del sistema (usted entiende DPI pero piensa que el mundo es siempre el sistema DPI y nunca cambiará) 3) por monitor consciente (usted entiende DPI y que puede cambiar mientras se está ejecutando) SetProcessDPIAware() hace que todo su sistema de proceso sea consciente SetProcessDpiAwareness (...) le permite especificar el modo de conciencia de su proceso SetThreadDpiAwarenessContext (. ..) habilita el subproceso DPI conciencia – peterfelts

Cuestiones relacionadas