Escalado de pantalla de Accesibilidad activa y Windows Vista

Windows Vista 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 de la pantalla aparezcan más grandes. Aunque esta característica ha estado disponible durante mucho tiempo en Microsoft Windows, en versiones anteriores, las aplicaciones tenían que implementar el escalado. En 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 accesibilidad activa de Microsoft 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 el ancho o el alto de una pulgada teórica. La medida exacta de una "pulgada" depende del tamaño y de la resolución física del monitor. Por ejemplo, en un monitor de 12 pulgadas de ancho, con una resolución horizontal de 1280 píxeles, una línea horizontal de 96 píxeles se amplía aproximadamente 9/10 de una pulgada.

Cambiar la configuración de ppp no es lo mismo que cambiar la resolución de pantalla. Con el ajuste de escala ppp , el número de píxeles físicos de la pantalla sigue siendo el mismo. Sin embargo, se aplica el ajuste de escala al tamaño y a la ubicación de los elementos UI. Este ajuste de escala 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 para cambiar de escala.

En efecto, cuando el usuario establece el factor de escala en 120 ppp, una pulgada vertical u horizontal en la pantalla aumenta en un 25 por ciento. Todas las dimensiones se escalan en consecuencia. El desplazamiento de una ventana desde los bordes superior e izquierdo de la pantalla aumenta en un 25 %. El tamaño de la ventana aumenta en la misma proporción, junto con los desplazamientos y tamaños de todos los elementos de la interfaz de usuario que contiene.

De forma predeterminada, el DWM no realiza el ajuste de escala para aplicaciones que no son de ppp cuando el usuario establece ppp en 120, pero lo realiza cuando ppp se establece en un valor personalizado de 144 o superior. Sin embargo, el usuario puede invalidar el comportamiento predeterminado.

El escalado de pantalla crea nuevos desafíos para las aplicaciones a las que les preocupa de cualquier manera las coordenadas de pantalla. La pantalla contiene ahora dos sistemas de coordenadas: físico y lógico. 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 de la manera que serían si se escalaran los propios píxeles.

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

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

Escalado en clientes de accesibilidad activa

Microsoft Active Accessibility no usa coordenadas lógicas. Los métodos y funciones siguientes devuelven coordenadas físicas o las toman como parámetros.

De forma predeterminada, una aplicación cliente de accesibilidad activa de Microsoft que se ejecuta en un entorno que no sea de 96 ppp no podrá obtener los resultados correctos de estas llamadas. Por ejemplo, dado que la posición del cursor está en coordenadas lógicas, el cliente simplemente no puede pasar estas coordenadas a AccessibleObjectFromPoint para obtener el elemento que está bajo el cursor.

Además, una aplicación que crea una ventana fuera de su área cliente, como una aplicación de accesibilidad que resalta elementos de interfaz de usuario centrados, no creará la ventana en la ubicación de pantalla correcta, ya que la ventana se colocará en las coordenadas lógicas, no las coordenadas físicas devueltas por IAccessible::accLocation.

La solución está en dos partes:

  • Haga que la aplicación cliente sea "compatible con ppp". Para ello, llame a la función SetProcessDPIAware en el inicio. Esta función hace que todo el proceso sea para ppp, lo que significa que todas las ventanas que pertenecen al proceso sean sin escala.
  • Use funciones compatibles con ppp. Por ejemplo, para obtener coordenadas del cursor, llame a la función GetPhysicalCursorPos . No use GetCursorPos; su comportamiento en las aplicaciones compatibles con ppp no está definido.

Si la aplicación realiza una comunicación directa entre procesos con aplicaciones no compatibles con ppp, es posible que haya convertido entre coordenadas lógicas y físicas mediante las funciones PhysicalToLogicalPoint y LogicalToPhysicalPoint .