Compartir a través de


UI Automation y ajuste de escala de la pantalla

NotaNota

Esta documentación está dirigida a desarrolladores de .NET Framework que desean usar las clases administradas de UI Automation definidas en el espacio de nombres System.Windows.Automation.Para obtener información actualizada sobre UI Automation, vea Windows Automation API: UI Automation.

Windows Vista permite a los usuarios cambiar la configuración de dots per inch (dpi) para que la mayoría de los elementos de user interface (UI) aparezcan más grandes en la pantalla. Aunque esta característica ha estado mucho tiempo disponible en Microsoft Windows, en las versiones anteriores las aplicaciones tenían que implementarla. En Windows Vista, el Administrador de ventanas de escritorio lleva a cabo el ajuste de escala predeterminado para todas las aplicaciones que no administran su propio ajuste de escala. Las aplicaciones cliente de Automatización de la interfaz de usuario deben tener en cuenta esta característica.

Este tema contiene las secciones siguientes.

  • Ajustar la escala en Windows Vista
  • Ajustar la escala en los clientes de automatización de la interfaz de usuario
  • Temas relacionados

Ajustar la escala en Windows Vista

El valor predeterminado de dpi es 96, que significa que 96 píxeles ocupan el ancho o alto de una pulgada. 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, con una resolución horizontal de 1280 píxeles, una línea horizontal de 96 píxeles ocupa aproximadamente 9/10 de pulgada.

Cambiar el valor de dpi no es lo mismo que cambiar la resolución de pantalla. Al ajustar la escala de dpi, el número de píxeles físicos de la pantalla sigue siendo el mismo. Sin embargo, el ajuste de la escala se aplica al tamaño y la ubicación de los elementos de la UI. El Administrador de ventanas de escritorio (DWM) puede realizar este ajuste de escala de forma automática para el escritorio y para las aplicaciones que no lo soliciten explícitamente.

En efecto, cuando el usuario establece el factor de escala en 120 dpi, una pulgada vertical u horizontal de la pantalla se incrementa en un 25 por ciento. La escala de todas las dimensiones se ajusta en consecuencia. El desplazamiento de una ventana de la aplicación desde los bordes superior e izquierdo de la pantalla se aumenta en un 25 por ciento. Si el ajuste de escala de aplicación está habilitado y la aplicación no identifica el valor de dpi, el tamaño de la ventana aumenta en la misma proporción, junto con los desplazamientos y los tamaños de todos los elementos de UI que contiene.

NotaNota

De manera predeterminada, el Administrador de ventanas de escritorio no ajusta la escala para las aplicaciones que no identifican el valor de dpi cuando el usuario establece dpi en 120, pero sí cuando el valor de dpi se establece en un valor personalizado de 144 o superior.Sin embargo, el usuario puede invalidar el comportamiento predeterminado.

El ajuste de escala de pantalla crea nuevos desafíos para las aplicaciones que tienen cualquier tipo de relación con las coordenadas de la pantalla. Ahora, la pantalla contiene dos sistemas de coordenadas: físico y lógico. Las coordenadas físicas de un punto son el desplazamiento real en píxeles con respecto al vértice superior izquierdo del origen. Las coordenadas lógicas son los desplazamientos que tendrían si se ajustara la escala de los propios píxeles.

Supongamos que ha diseñado un cuadro de diálogo con un botón en las coordenadas (100, 48). Cuando este cuadro de diálogo se muestra con el valor predeterminado de dpi, 96, el botón se sitúa en las coordenadas físicas (100, 48). Si el valor de dpi es 120, se sitúa en las coordenadas físicas (125, 60). Sin embargo, las coordenadas lógicas son las mismas para todos los valores de dpi: (100, 48).

Las coordenadas lógicas son importantes, porque permiten que el comportamiento del sistema operativo y de las aplicaciones sea coherente independientemente del valor de dpi. Por ejemplo, Cursor.Position suele devolver las coordenadas lógicas. Si desplaza el cursor por encima de un elemento de un cuadro de diálogo, se devuelven las mismas coordenadas sea cual sea el valor de dpi. Si dibuja un control en (100, 100), se dibuja con esas coordenadas lógicas y ocupa la misma posición relativa para cualquier valor de dpi.

Ajustar la escala en los clientes de automatización de la interfaz de usuario

La API de UI Automation no utiliza las coordenadas lógicas. Los métodos y propiedades siguientes devuelven coordenadas físicas o las toman como parámetros.

De manera predeterminada, una aplicación cliente de Automatización de la interfaz de usuario que se ejecuta en un entorno donde el valor de dpi no es 96, no pueden obtenerse resultados correctos de estos métodos y propiedades. Por ejemplo, dado que la posición del cursor se expresa en coordenadas lógicas, el cliente no puede pasar simplemente las coordenadas a FromPoint para obtener el elemento que está situado bajo el cursor. Además, la aplicación no podrá colocar correctamente las ventanas fuera de su área de cliente.

La solución se divide en dos partes.

  1. En primer lugar, debe hacer que la aplicación cliente identifique el valor de dpi. Para ello, llame a la función SetProcessDPIAware de Win32 en el inicio. En el código administrado, la declaración siguiente hace que esta función esté disponible.

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

    Esta función hace que se identifique el valor de dpi en todo el proceso, lo que significa que no se ajusta la escala de ninguna de las ventanas que pertenecen al proceso. En Highlighter Sample, por ejemplo, las cuatro ventanas que forman el rectángulo resaltado se encuentran en las coordenadas físicas obtenidas de UI Automation, no en las coordenadas lógicas. Si en el ejemplo no se identificara el valor de dpi, el resaltado se dibujaría en las coordenadas lógicas del escritorio y quedaría colocado en un lugar incorrecto si valor de dpi en el entorno no fuera 96.

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

    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
    
    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;
        }
    }
    
Nota de precauciónPrecaución

No utilice Cursor.Position.El comportamiento de esta propiedad fuera de las ventanas de cliente en un entorno con ajuste de escala no está definido.

Si la aplicación realiza la comunicación entre procesos con aplicaciones que no identifican el valor de dpi, puede ser necesario convertir entre las coordenadas lógicas y físicas mediante las funciones PhysicalToLogicalPoint y LogicalToPhysicalPoint de Win32. 

Vea también

Tareas

Highlighter Sample