Condividi tramite


Automazione interfaccia utente e ridimensionamento dello schermo

NotaNota

La presente documentazione è destinata agli sviluppatori di .NET Framework che desiderano utilizzare le classi UI Automation gestite definite nello spazio dei nomi System.Windows.Automation.Per informazioni aggiornate sull'UI Automation, vedere Windows Automation API: Automazione interfaccia utente (la pagina potrebbe essere in inglese).

Windows Vista consente agli utenti di modificare l'impostazione dots per inch (dpi) in modo da visualizzare la maggior parte degli elementi dell'user interface (UI) sullo schermo con dimensioni maggiori. Benché questa funzionalità fosse già disponibile da tempo in Microsoft Windows, nelle versioni precedenti era necessario che il ridimensionamento fosse implementato dalle applicazioni. In Windows Vista, con Gestione finestre desktop viene applicato il ridimensionamento predefinito per tutte le applicazioni che non gestiscono direttamente tale funzionalità. Per le applicazioni client di automazione interfaccia utente è necessario tenere conto di questa funzionalità.

Nel presente argomento sono contenute le seguenti sezioni.

  • Ridimensionamento in Windows Vista
  • Ridimensionamento nei client di automazione interfaccia utente
  • Argomenti correlati

Ridimensionamento in Windows Vista

L'impostazione predefinita di dpi è 96, ovvero 96 pixel che occupano la larghezza o l'altezza di un pollice astratto. 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 dei dpi non corrisponde alla modifica della risoluzione dello schermo. Con le proporzioni dei dpi, il numero di pixel fisici sullo schermo rimane lo stesso. Il ridimensionamento viene tuttavia applicato alle dimensioni e alla posizione degli elementi dell'UI. È 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 aumenta del 25%. Tutte le dimensioni vengono ridimensionate di conseguenza. L'offset di una finestra dell'applicazione dai bordi superiore e sinistro dello schermo aumenta del 25%. Se il ridimensionamento dell'applicazione è abilitato e l'applicazione non utilizza valori dpi, le dimensioni della finestra aumentano nella stessa proporzione, con gli offset e le dimensioni di tutti gli elementi dell'UI che contiene.

NotaNota

Per impostazione predefinita, il ridimensionamento di Gestione finestre desktop non viene eseguito per le applicazioni che non utilizzano valori dpi quando si impostano i dpi su 120, ma solo quando i dpi sono impostati su un valore personalizzato pari o maggiore di 144.È 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 la finestra di dialogo viene visualizzata con l'impostazione predefinita di 96 dpi, il pulsante si trova in corrispondenza delle coordinate fisiche (100, 48). Con l'impostazione di 120 dpi, il pulsante si trova in corrispondenza delle coordinate fisiche (125, 60). Le coordinate logiche, tuttavia, rimangono le stesse indipendentemente dall'impostazione dei dpi: (100, 48).

Le coordinate logiche sono importanti in quanto garantiscono il comportamento coerente del sistema operativo e delle applicazioni indipendentemente dall'impostazione dei dpi. Ad esempio, la proprietà Cursor.Position restituisce in genere le coordinate logiche. Se si sposta il cursore su un elemento in una finestra di dialogo, le stesse coordinate vengono restituite indipendentemente dall'impostazione dei dpi. Se si disegna un controllo in corrispondenza delle coordinate (100, 100), il controllo viene disegnato su queste coordinate logiche e occupa la stessa posizione relativa con qualsiasi impostazione dei dpi.

Ridimensionamento nei client di automazione interfaccia utente

Nell'API di UI Automation non vengono utilizzate le coordinate logiche. I metodi e le proprietà seguenti restituiscono coordinate fisiche o le accettano come parametri.

Per impostazione predefinita, non sarà possibile ottenere risultati corretti da questi metodi e proprietà in un'applicazione client di automazione interfaccia utente in esecuzione in un ambiente non a 96 dpi. Ad esempio, poiché la posizione del cursore è definita in coordinate logiche, il client non può semplicemente passare tali coordinate al metodo FromPoint per ottenere l'elemento sotto il cursore. Inoltre, l'applicazione non sarà in grado di posizionare correttamente le finestre al di fuori dell'area client.

La soluzione è costituita da due parti.

  1. Innanzitutto, occorre fare in modo che l'applicazione client utilizzi valori dpi. A tale scopo, chiamare la funzione Win32 SetProcessDPIAware all'avvio. In codice gestito, la dichiarazione seguente rende disponibile questa funzione.

    <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();
    

    Grazie a questa funzione, l'intero processo utilizzerà valori dpi, pertanto tutte le finestre appartenenti al processo non verranno ridimensionate. Nell'Highlighter Sample, le quattro finestre che costituiscono il rettangolo di evidenziazione si trovano in corrispondenza delle coordinate fisiche ottenute da UI Automation, non delle coordinate logiche. Se nell'esempio non venissero utilizzati valori dpi, l'evidenziazione verrebbe disegnata in corrispondenza delle coordinate logiche sul desktop, con la conseguenza di un posizionamento errato in un ambiente non a 96 dpi.

  2. Per ottenere coordinate del cursore, chiamare la funzione GetPhysicalCursorPos di Win32. Nell'esempio riportato di seguito viene illustrato come dichiarare e utilizzare questa funzione.

    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 di avvisoAttenzione

Non utilizzare la proprietà Cursor.Position.Il comportamento di questa proprietà al di fuori delle finestre client in un ambiente non ridimensionato non è definito.

Se nell'applicazione viene eseguita comunicazione tra processi diretta con applicazioni che non utilizzano valori dpi, può essere necessario convertire le coordinate logiche e fisiche utilizzando le funzioni PhysicalToLogicalPoint e LogicalToPhysicalPoint di Win32. 

Vedere anche

Attività

Highlighter Sample