Accessibilità attiva e ridimensionamento dello schermo di Windows Vista

Windows Vista consente agli utenti di modificare l'impostazione dots-per-pollice (dpi) in modo che la maggior parte degli elementi dell'interfaccia utente sullo schermo venga visualizzata più grande. Anche se questa funzionalità è stata a lungo disponibile in Microsoft Windows, nelle versioni precedenti il ridimensionamento doveva essere implementato dalle applicazioni. In Windows Vista, Desktop Window Manager esegue il ridimensionamento predefinito per tutte le applicazioni che non gestiscono la propria scalabilità. Le applicazioni client di Accessibilità attiva Microsoft devono prendere in considerazione questa funzionalità.

Ridimensionamento in Windows Vista

L'impostazione dpi predefinita è 96, il che significa che 96 pixel occupano una larghezza o un'altezza di un pollice notale. La misura esatta di un pollice dipende dalle dimensioni e dalla risoluzione fisica del monitor. Ad esempio, su un monitor con una larghezza di 12 pollici e una risoluzione orizzontale di 1280 pixel, una riga orizzontale di 96 pixel si estende per circa 9/10 di un pollice.

La modifica dell'impostazione dpi non corrisponde alla modifica della risoluzione dello schermo. Con il ridimensionamento dpi, il numero di pixel fisici sullo schermo rimane invariato. Tuttavia, il ridimensionamento viene applicato alle dimensioni e alla posizione degli elementi dell'interfaccia utente. È possibile eseguire il ridimensionamento automaticamente con Gestione finestre desktop per il desktop e per le applicazioni che non richiedono tale funzionalità in modo esplicito.

In effetti, quando l'utente imposta il fattore di scala su 120 dpi, un pollice verticale o orizzontale sullo schermo diventa più grande del 25%. Tutte le dimensioni vengono ridimensionate di conseguenza. L'offset di una finestra dai bordi superiore e sinistro dello schermo aumenta del 25%. Le dimensioni della finestra aumentano nella stessa proporzione, insieme agli offset e alle dimensioni di tutti gli elementi dell'interfaccia utente contenuti.

Per impostazione predefinita, DWM non esegue il ridimensionamento per applicazioni non compatibili con dpi quando l'utente imposta il valore dpi su 120, ma lo esegue quando il valore dpi è impostato su un valore personalizzato pari a 144 o superiore. È tuttavia possibile ignorare questo comportamento predefinito.

Il ridimensionamento dello schermo crea nuove sfide per le applicazioni che dipendono dalle coordinate dello schermo. Lo schermo contiene ora due sistemi di coordinate: fisico e logico. Le coordinate fisiche di un punto sono l'offset effettivo in pixel dalla parte superiore sinistra dell'origine. Le coordinate logiche sono gli offset così come si presenterebbero se i pixel fossero ridimensionati.

Si supponga di progettare una finestra di dialogo con un pulsante in corrispondenza delle coordinate (100, 48). Quando questa finestra di dialogo viene visualizzata al valore predefinito 96 dpi, il pulsante si trova in coordinate fisiche di (100, 48). A 120 dpi, si trova a coordinate fisiche di (125, 60). Ma le coordinate logiche sono uguali a qualsiasi impostazione dpi: (100, 48).

Le coordinate logiche sono importanti, perché rendono il comportamento del sistema operativo e delle applicazioni coerenti indipendentemente dall'impostazione dpi. Ad esempio, System.Windows.Forms.Cursor.Position restituisce normalmente le coordinate logiche. Se si sposta il cursore su un elemento in una finestra di dialogo, le stesse coordinate vengono restituite indipendentemente dall'impostazione dpi. Se si disegna un controllo a (100, 100), viene disegnato a tali coordinate logiche e occupa la stessa posizione relativa in qualsiasi impostazione dpi.

Ridimensionamento nei client di accessibilità attivi

L'accessibilità attiva Microsoft non usa coordinate logiche. I metodi e le funzioni seguenti restituiscono coordinate fisiche o li accettano come parametri.

Per impostazione predefinita, un'applicazione client Microsoft Active Accessibility in esecuzione in un ambiente non a 96 dpi non sarà in grado di ottenere risultati corretti da queste chiamate. Ad esempio, poiché la posizione del cursore è in coordinate logiche, il client non può semplicemente passare queste coordinate a AccessibleObjectFromPoint per ottenere l'elemento che si trova sotto il cursore.

Inoltre, un'applicazione che crea una finestra all'esterno dell'area client, ad esempio un'applicazione di accessibilità che evidenzia gli elementi dell'interfaccia utente concentrati, non creerà la finestra nella posizione della schermata corretta, perché la finestra verrà posizionata alle coordinate logiche, non le coordinate fisiche restituite da IAccess::accLocation.

La soluzione è in due parti:

  • Rendere l'applicazione client "con riconoscimento dpi". A tale scopo, chiamare la funzione SetProcessDPIAware all'avvio. Questa funzione rende l'intero processo con riconoscimento dpi, ovvero tutte le finestre che appartengono al processo non vengono ridimensionate.
  • Usare le funzioni con riconoscimento dpi. Ad esempio, per ottenere le coordinate del cursore, chiamare la funzione GetPhysicalCursorPos . Non usare GetCursorPos; il comportamento nelle applicazioni con riconoscimento dpi non è definito.

Se l'applicazione esegue una comunicazione tra processi diretti con applicazioni non con riconoscimento dpi, potrebbe essere possibile convertire tra coordinate logiche e fisiche usando le funzioni PhysicalToLogicPoint eLogicalToPhysicalPoint .