visual-studio-2013 manifest dpi highdpi hidpi

visual studio 2013 - ¿Cómo puedo configurar la propiedad dpiAware en un manifiesto de aplicación de Windows en "por monitor" en Visual Studio?



visual-studio-2013 manifest (3)

Necesito poder establecer la propiedad de dpiAware en el manifiesto de mi aplicación en "por monitor". Las opciones disponibles en las propiedades son solo para habilitar o deshabilitar el reconocimiento de DPI. Ninguna de estas configuraciones funciona para mí. Puedo obtener el comportamiento que deseo para mi aplicación si no incrusto el manifiesto en el exe, luego edito el manifiesto manualmente. Quiero generar automáticamente e insertar el manifiesto. ¿Hay algo que este olvidando? (Estoy usando Visual Studio 2013.)


Este manifiesto funciona, y <dpiAware>True/PM</dpiAware> es la parte más importante:

<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> </application> </compatibility> <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>True/PM</dpiAware> </asmv3:windowsSettings> </asmv3:application> </asmv1:assembly>


Lo nuevo en Windows 10 es dpiAwareness y dpiAware , por lo que debemos actualizar este ejemplo un poco. Ahora está bien, porque si dpiAwareness no existe, entonces la configuración se heredará de dpiAware .

Para habilitar el conocimiento de DPI por completo, con la última compatibilidad con Win10 (vea la URL de referencia para otras opciones posibles), que incluye '' permonitor '' y '' permonitorv2 '', que usaré en lugar de ''sistema'' porque su pregunta así lo requiere .

<asmv3:application> <asmv3:windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- legacy --> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to pm if pmv2 is not available --> </asmv3:windowsSettings> </asmv3:application>

Para deshabilitar , haría lo contrario (sin necesidad de dpiAwareness ya que no lo dpiAwareness ):

<asmv3:application> <asmv3:windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">unaware</dpiAware> </asmv3:windowsSettings> </asmv3:application>

Luego, incluso hay ''gdiScaling'' si usa objetos GDI para pintar algunas de sus cosas.

<asmv3:application> <asmv3:windowsSettings> <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling> </asmv3:windowsSettings> </asmv3:application>

Referencia: Microsoft en DPI Awareness a partir de la última versión de Windows 10 (también tiene tutoriales sobre cómo hacer que su código DPI sea consciente, incluso si es un poco tedioso para proyectos más grandes)


En Windows 10 1607, se introdujo una nueva propiedad denominada dpiAwareness . Permite elegir una alternativa de escalado DPI y anula la propiedad dpiAware , si existe. Para la mejor compatibilidad, uno debe especificar ambos y asegurarse de que su aplicación funcione con todos los niveles de percepción de DPI.

El siguiente manifiesto permite la percepción por DPI de la versión 2 de DPI en Windows 10 1607+, el reconocimiento de DPI por monitor en Windows 8.1+ y el reconocimiento de DPI de sistema en Windows 7:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <assemblyIdentity type="win32" name="MyApplication" version="1.0.0.0" processorArchitecture="amd64"/> <asmv3:application> <asmv3:windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 --> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to per-monitor if per-monitor v2 is not supported --> <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling> <!-- enables GDI DPI scaling --> </asmv3:windowsSettings> </asmv3:application> </assembly>

Para desactivar el reconocimiento de DPI, puede simplemente dejar el conocimiento de DPI sin especificar (el valor predeterminado es desconocido) o especificar dpiAware como false .

También tenga en cuenta la propiedad gdiScaling , que se agregó en Windows 10 1607. Permite la escala automática de GDI si se establece en true . Es muy útil si su aplicación usa GDI para dibujar cosas.

Referencias
Escalado de PPP alto desde Windows 10 1607
Escribir aplicaciones con reconocimiento de DPI
La aplicación se manifiesta