Compartir a través de


Automatización de la interfaz de usuario y escalado de pantalla

Nota:

Esta documentación está pensada para desarrolladores de .NET Framework que desean usar las clases de automatización de la interfaz de usuario administradas definidas en el espacio de nombres System.Windows.Automation. Para obtener la información más reciente sobre la automatización de la interfaz de usuario, consulte API de Windows Automation: Automatización de la interfaz de usuario.

A partir de Windows Vista, Windows permite a los usuarios cambiar la configuración de puntos por pulgada (ppp) para que la mayoría de los elementos de la interfaz de usuario (UI) de la pantalla aparezcan más grandes. Aunque esta característica ha estado disponible durante mucho tiempo en Windows, en versiones anteriores, las aplicaciones tenían que implementar el escalado. A partir de Windows Vista, el Administrador de ventanas de escritorio realiza el escalado predeterminado para todas las aplicaciones que no controlan su propio escalado. Las aplicaciones cliente de Automatización de la interfaz de usuario deben tener en cuenta esta característica.

Escalado en Windows Vista

La configuración de ppp predeterminada es 96, lo que significa que 96 píxeles ocupan un ancho o alto de una pulgada teórica. La medida exacta de una "pulgada" depende del tamaño y la resolución física del monitor. Por ejemplo, en un monitor de 12 pulgadas de ancho, en una resolución horizontal de 1280 píxeles, una línea horizontal de 96 píxeles se extiende aproximadamente 9/10 de una pulgada.

Cambiar la configuración de puntos por pulgada no es lo mismo que cambiar la resolución de pantalla. Con el escalado de puntos por pulgada, el número de píxeles físicos en la pantalla sigue siendo el mismo. Sin embargo, el escalado se aplica al tamaño y la ubicación de los elementos de la interfaz de usuario. Este escalado se puede realizar automáticamente mediante el Administrador de ventanas de escritorio (DWM) para el escritorio y para las aplicaciones que no solicitan explícitamente que no se escalen.

En efecto, cuando el usuario establece el factor de escala en 120 ppp, una pulgada vertical o horizontal en la pantalla se vuelve más grande en un 25 por ciento. Todas las dimensiones se escalan según corresponda. El desplazamiento de una ventana de aplicación desde los bordes superior e izquierdo de la pantalla aumenta en un 25 %. Si el escalado de aplicaciones está habilitado y la aplicación no es compatible con la dpi, el tamaño de la ventana se incrementa proporcionalmente, junto con los desplazamientos y tamaños de todos los elementos de la interfaz de usuario que contiene.

Nota:

De forma predeterminada, DWM no realiza el escalado para aplicaciones que no son conscientes de ppp cuando el usuario ajusta el ppp a 120, pero lo realiza cuando el ppp se ajusta a un ajuste personalizado de 144 o más. Sin embargo, el usuario puede invalidar el comportamiento predeterminado.

El escalado de pantalla crea nuevos desafíos para las aplicaciones que se preocupan de cualquier manera con coordenadas de pantalla. La pantalla ahora contiene dos sistemas de coordenadas: físicos y lógicos. Las coordenadas físicas de un punto son el desplazamiento real en píxeles desde la parte superior izquierda del origen. Las coordenadas lógicas son los desplazamientos tal como serían si los propios píxeles se escalaran.

Supongamos que diseña un cuadro de diálogo con un botón en coordenadas (100, 48). Cuando este cuadro de diálogo se muestra en el valor predeterminado de 96 ppp, el botón se encuentra en coordenadas físicas de (100, 48). A 120 ppp, se encuentra en coordenadas físicas de (125, 60). Pero las coordenadas lógicas son las mismas en cualquier configuración de ppp: (100, 48).

Las coordenadas lógicas son importantes, ya que hacen que el comportamiento del sistema operativo y las aplicaciones sea coherente independientemente de la configuración de DPI. Por ejemplo, Cursor.Position normalmente devuelve las coordenadas lógicas. Si mueve el cursor sobre un elemento de un cuadro de diálogo, se devuelven las mismas coordenadas independientemente de la configuración de ppp. Si dibuja un control en (100, 100), se dibuja en esas coordenadas lógicas y ocupará la misma posición relativa en cualquier ajuste de dpi.

Escalado en clientes de automatización de la interfaz de usuario

La API de automatización de la interfaz de usuario no usa coordenadas lógicas. Los métodos y propiedades siguientes devuelven coordenadas físicas o las toman como parámetros.

De forma predeterminada, una aplicación cliente de automatización de la interfaz de usuario que se ejecuta en un entorno que no sea de 96 ppp no podrá obtener resultados correctos de estos métodos y propiedades. Por ejemplo, dado que la posición del cursor está en coordenadas lógicas, el cliente simplemente no puede pasar estas coordenadas para FromPoint obtener el elemento que está bajo el cursor. Además, la aplicación no podrá colocar correctamente ventanas fuera de su área cliente.

La solución está en dos partes.

  1. En primer lugar, haga que la aplicación del cliente sea compatible con la configuración de DPI. Para ello, al inicio, llame a la función Win32 SetProcessDPIAware. En el código administrado, la siguiente declaración hace que esta función esté disponible.

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    internal static extern bool SetProcessDPIAware();
    
    <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Friend Shared Function SetProcessDPIAware() As Boolean
    End Function
    

    Esta función hace que todo el proceso sea compatible con ppp, lo que significa que todas las ventanas que pertenecen al proceso no se escalan. En el ejemplo de resaltado, por ejemplo, las cuatro ventanas que componen el rectángulo de resaltado se encuentran en las coordenadas físicas obtenidas de automatización de la interfaz de usuario, no en las coordenadas lógicas. Si el ejemplo no era para ppp, el resaltado se dibujaría en las coordenadas lógicas del escritorio, lo que daría lugar a una ubicación incorrecta en un entorno que no sea de 96 ppp.

  2. Para obtener las coordenadas del cursor, llame a la función Win32 GetPhysicalCursorPos. En el ejemplo siguiente se muestra cómo declarar y usar esta función.

    public struct CursorPoint
    {
        public int X;
        public int Y;
    }
    
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    internal static extern bool GetPhysicalCursorPos(ref CursorPoint lpPoint);
    
    private bool ShowUsage()
    {
        CursorPoint cursorPos = new CursorPoint();
        try
        {
            return GetPhysicalCursorPos(ref cursorPos);
        }
        catch (EntryPointNotFoundException) // Not Windows Vista
        {
            return false;
        }
    }
    
    Structure CursorPoint
        Public X As Integer
        Public Y As Integer
    End Structure
    
    <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Friend Shared Function GetPhysicalCursorPos(ByRef lpPoint As CursorPoint) As Boolean
    End Function
    
    Private Function ShowUsage() As Boolean
    
        Dim cursorPos As New CursorPoint()
        Try
            Return GetPhysicalCursorPos(cursorPos)
        Catch e As EntryPointNotFoundException ' Not Windows Vista
            Return False
        End Try
    
    End Function
    

Precaución

No use Cursor.Position. El comportamiento de esta propiedad fuera de las ventanas de cliente en un entorno escalado no está definido.

Si su aplicación realiza una comunicación directa entre procesos con aplicaciones no compatibles con ppp, es posible que tenga que convertir entre coordenadas lógicas y físicas utilizando las funciones Win32 PhysicalToLogicalPoint y LogicalToPhysicalPoint.

Consulte también