Establecimiento del reconocimiento de PPP predeterminado para un proceso

Las aplicaciones de escritorio en Windows se pueden ejecutar en diferentes modos de reconocimiento de PPP. Estos modos permiten un comportamiento de escalado de PPP diferente y pueden usar diferentes espacios de coordenadas. Para obtener más información sobre el reconocimiento de PPP, consulte Desarrollo de aplicaciones de escritorio con valores altos de PPP en Windows. Es importante establecer explícitamente el modo de reconocimiento de PPP predeterminado del proceso para evitar un comportamiento inesperado.

Hay dos métodos principales para especificar el reconocimiento de PPP predeterminado de un proceso:

1) a través de una configuración de manifiesto de aplicación

2) mediante programación a través de una llamada API

Se recomienda especificar el reconocimiento de PPP del proceso predeterminado a través de una configuración de manifiesto. Aunque se admite la especificación del valor predeterminado a través de la API, no se recomienda.

Establecimiento del reconocimiento predeterminado con el manifiesto de aplicación

Hay dos valores de manifiesto que permiten especificar el modo de reconocimiento de PPP predeterminado del proceso: <dpiAwareness> y <dpiAware>. <dpiAware> se introdujo en Windows Vista y solo permite que el proceso se establezca de forma predeterminada en el reconocimiento del sistema. <dpiAwareness> se introdujo en Windows 10, versión 1607 y le permite especificar una lista ordenada de modos de reconocimiento de PPP predeterminados del proceso. Esto le permite establecer los modos de reconocimiento de PPP de reserva, que se usarán si la aplicación se ejecuta en una versión de Windows que no puede admitir el primer modo de reconocimiento especificado. En versiones anteriores de Windows, se omitirá la etiqueta <dpiAwareness> más reciente. Esto significa que puede utilizar ambas configuraciones de manifiesto para habilitar un escenario en el que su proceso predeterminado podría ser el reconocimiento del sistema en la versión anterior de Windows, mientras que sería por monitor en versiones posteriores a Windows 10, versión 1607. En Windows 10, versión 1607 y posteriores, el valor de <dpiAware> se ignora si el elemento <dpiAwareness> está presente.

En la tabla siguiente se muestra cómo especificar diferentes modos de reconocimiento de PPP predeterminados del proceso mediante la configuración de dos manifiestos:

Modo de reconocimiento de PPP predeterminado de proceso Configuración de <dpiAware> Configuración de <dpiAwareness>
(Windows 10, versión 1607 y posteriores)
sin reconocimiento N/A (sin configuración de dpiAware en el manifiesto)
o
<dpiAware>false</dpiAware>
<dpiAwareness>unaware</dpiAwareness>
Con reconocimiento del sistema <dpiAware>true</dpiAware> <dpiAwareness>system</dpiAwareness>
Por monitor <dpiAware>true/pm<dpiAware> <dpiAwareness>PerMonitor</dpiAwareness>
Por monitor V2 No compatible <dpiAwareness>PerMonitorV2</dpiAwareness>

 

En el ejemplo siguiente se muestran los valores de <dpiAwareness> y <dpiAware> que se usan en el mismo archivo de manifiesto para configurar el comportamiento de reconocimiento de PPP predeterminado del proceso para diferentes versiones de Windows.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  <asmv3:application>
    <asmv3:windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Establecimiento del reconocimiento predeterminado mediante programación

Aunque no se recomienda, es posible establecer el reconocimiento de PPP predeterminado mediante programación. Una vez creada una ventana (un HWND) en el proceso, ya no se admite el cambio del modo de reconocimiento de PPP. Si establece el modo de reconocimiento de PPP predeterminado del proceso mediante programación, debe llamar a la API correspondiente antes de que se hayan creado los HWND.

Hay varias API que permiten especificar el reconocimiento de PPP predeterminado para el proceso. La API recomendada actual es SetProcessDpiAwarenessContext, ya que las API anteriores ofrecen menos funcionalidad.

API Versión mínima de Windows PPP no consciente Reconocimiento de PPP del sistema Reconocimiento de PPP por monitor
SetProcessDPIAware Windows Vista N/D SetProcessDPIAware() N/D
SetProcessDpiAwareness Windows 8.1 SetProcessDpiAwareness(PROCESS_DPI_UNAWARE) SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)
SetProcessDpiAwarenessContext Windows 10, versión 1607 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE) SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE)

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)

Valor predeterminado del proceso frente al valor predeterminado de subproceso

Este documento hace referencia a establecer el reconocimiento de PPP predeterminado para el proceso. Esto se debe a que Windows 10 introdujo compatibilidad para ejecutar más de un modo de reconocimiento de PPP dentro de un único proceso (antes de Windows 10, todo el proceso tenía que ajustarse a un solo modo de reconocimiento de PPP). La compatibilidad con la ejecución de más de un modo de reconocimiento de PPP dentro de un proceso se conoce como "escalado de PPP en modo mixto". Al usar el escalado de PPP en modo mixto dentro del proceso, cada ventana de nivel superior se puede ejecutar en un modo de reconocimiento de PPP que puede ser diferente del predeterminado del proceso. A menos que se especifique explícitamente, cada subproceso tendrá como valor predeterminado el valor predeterminado del proceso cuando se cree. Para obtener más información sobre el escalado de PPP en modo mixto, consulte el artículo Escalado de PPP en modo mixto y API compatibles con PPP.