Automazione interfaccia utente e ridimensionamento dello schermoUI Automation and Screen Scaling

Nota

Questa documentazione è destinata agli sviluppatori di .NET Framework che vogliono usare le classi gestite di Automazione interfaccia utenteUI Automation definite nello spazio dei nomi System.Windows.Automation.This documentation is intended for .NET Framework developers who want to use the managed Automazione interfaccia utenteUI Automation classes defined in the System.Windows.Automation namespace. Per informazioni aggiornate su Automazione interfaccia utenteUI Automation, vedere l'argomento sull' API Automazione interfaccia utente di Windows.For the latest information about Automazione interfaccia utenteUI Automation, see Windows Automation API: UI Automation.

Windows VistaWindows Vista consente agli utenti di modificare l'impostazione punti per pollice (dpi)dots per inch (dpi) in modo da visualizzare la maggior parte degli elementi dell' interfaccia utenteuser interface (UI) sullo schermo con dimensioni maggiori. enables users to change the punti per pollice (dpi)dots per inch (dpi) setting so that most interfaccia utenteuser interface (UI) elements on the screen appear larger. Benché questa funzionalità fosse già disponibile da tempo in Microsoft WindowsMicrosoft Windows, nelle versioni precedenti era necessario che il ridimensionamento fosse implementato dalle applicazioni.Although this feature has long been available in Microsoft WindowsMicrosoft Windows, in previous versions the scaling had to be implemented by applications. In Windows VistaWindows Vista, con Gestione finestre desktop viene applicato il ridimensionamento predefinito per tutte le applicazioni che non gestiscono direttamente tale funzionalità.In Windows VistaWindows Vista, the Desktop Window Manager performs default scaling for all applications that do not handle their own scaling. Per le applicazioni client di automazione interfaccia utente è necessario tenere conto di questa funzionalità.UI Automation client applications must take this feature into account.

Ridimensionamento in Windows VistaScaling in Windows Vista

L'impostazione predefinita di dpidpi è 96, ovvero 96 pixel che occupano la larghezza o l'altezza di un pollice astratto.The default dpidpi setting is 96, which means that 96 pixels occupy a width or height of one notional inch. La misura esatta di un pollice dipende dalle dimensioni e dalla risoluzione fisica del monitor.The exact measure of an "inch" depends on the size and physical resolution of the 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.For example, on a monitor 12 inches wide, at a horizontal resolution of 1280 pixels, a horizontal line of 96 pixels extends about 9/10 of an inch.

La modifica dell'impostazione dei dpidpi non corrisponde alla modifica della risoluzione dello schermo.Changing the dpidpi setting is not the same as changing the screen resolution. Con le proporzioni dei dpidpi , il numero di pixel fisici sullo schermo rimane lo stesso.With dpidpi scaling, the number of physical pixels on the screen remains the same. Il ridimensionamento viene tuttavia applicato alle dimensioni e alla posizione degli elementi dell' Interfaccia utenteUI .However, scaling is applied to the size and location of Interfaccia utenteUI elements. È possibile eseguire il ridimensionamento automaticamente con Gestione finestre desktop per il desktop e per le applicazioni che non richiedono tale funzionalità in modo esplicito.This scaling can be performed automatically by the Desktop Window Manager (DWM) for the desktop and for applications that do not explicitly ask not to be scaled.

In effetti, quando l'utente imposta il fattore di scala su 120 dpidpi, un pollice verticale o orizzontale sullo schermo aumenta del 25%.In effect, when the user sets the scale factor to 120 dpidpi, a vertical or horizontal inch on the screen becomes bigger by 25 percent. Tutte le dimensioni vengono ridimensionate di conseguenza.All dimensions are scaled accordingly. L'offset di una finestra dell'applicazione dai bordi superiore e sinistro dello schermo aumenta del 25%.The offset of an application window from the top and left edges of the screen increases by 25 percent. Se il ridimensionamento dell'applicazione è abilitato e l'applicazione non usa valori dpidpi, le dimensioni della finestra aumentano nella stessa proporzione, con gli offset e le dimensioni di tutti gli elementi dell' Interfaccia utenteUI che contiene.If application scaling is enabled and the application is not dpidpi-aware, the size of the window increases in the same proportion, along with the offsets and sizes of all Interfaccia utenteUI elements it contains.

Nota

Per impostazione predefinita, il ridimensionamento di Gestione finestre desktop non viene eseguito per le applicazioni che non usano valoridpidpiquando si impostano i dpidpi su 120, ma solo quando i dpidpi sono impostati su un valore personalizzato pari o maggiore di 144.By default, the DWM does not perform scaling for non-dpidpi-aware applications when the user sets the dpidpi to 120, but does perform it when the dpidpi is set to a custom value of 144 or higher. È tuttavia possibile ignorare questo comportamento predefinito.However, the user can override the default behavior.

Il ridimensionamento dello schermo crea nuove sfide per le applicazioni che dipendono dalle coordinate dello schermo.Screen scaling creates new challenges for applications that are concerned in any way with screen coordinates. Lo schermo contiene ora due sistemi di coordinate: fisico e logico.The screen now contains two coordinate systems: physical and logical. Le coordinate fisiche di un punto sono l'offset effettivo in pixel dalla parte superiore sinistra dell'origine.The physical coordinates of a point are the actual offset in pixels from the top left of the origin. Le coordinate logiche sono gli offset così come si presenterebbero se i pixel fossero ridimensionati.The logical coordinates are the offsets as they would be if the pixels themselves were scaled.

Si supponga di progettare una finestra di dialogo con un pulsante in corrispondenza delle coordinate (100, 48).Suppose you design a dialog box with a button at coordinates (100, 48). Quando la finestra di dialogo viene visualizzata con l'impostazione predefinita di 96 dpidpi, il pulsante si trova in corrispondenza delle coordinate fisiche (100, 48).When this dialog box is displayed at the default 96 dpidpi, the button is located at physical coordinates of (100, 48). Con l'impostazione di 120 dpidpi, il pulsante si trova in corrispondenza delle coordinate fisiche (125, 60).At 120 dpidpi, it is located at physical coordinates of (125, 60). Le coordinate logiche, tuttavia, rimangono le stesse indipendentemente dall'impostazione dei dpidpi : (100, 48).But the logical coordinates are the same at any dpidpi setting: (100, 48).

Le coordinate logiche sono importanti in quanto garantiscono il comportamento coerente del sistema operativo e delle applicazioni indipendentemente dall'impostazione dei dpidpi .Logical coordinates are important, because they make the behavior of the operating system and applications consistent regardless of the dpidpi setting. Ad esempio, Cursor.Position restituisce in genere le coordinate logiche.For example, Cursor.Position normally returns the logical coordinates. Se si sposta il cursore su un elemento in una finestra di dialogo, le stesse coordinate vengono restituite indipendentemente dall'impostazione dei dpidpi .If you move the cursor over an element in a dialog box, the same coordinates are returned regardless of the dpidpi setting. 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 dpidpi .If you draw a control at (100, 100), it is drawn to those logical coordinates, and will occupy the same relative position at any dpidpi setting.

Ridimensionamento nei client di automazione interfaccia utenteScaling in UI Automation Clients

Nell' Automazione interfaccia utenteUI Automation APIAPI does not use logical coordinates.The Automazione interfaccia utenteUI Automation APIAPI does not use logical coordinates. I metodi e le proprietà seguenti restituiscono coordinate fisiche o le accettano come parametri.The following methods and properties either return physical coordinates or take them as parameters.

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 dpidpi .By default, a UI Automation client application running in a non-96- dpidpi environment will not be able to obtain correct results from these methods and properties. 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.For example, because the cursor position is in logical coordinates, the client cannot simply pass these coordinates to FromPoint to obtain the element that is under the cursor. Inoltre, l'applicazione non sarà in grado di posizionare correttamente le finestre al di fuori dell'area client.In addition, the application will not be able to correctly place windows outside its client area.

La soluzione è costituita da due parti.The solution is in two parts.

  1. Innanzitutto, occorre fare in modo che l'applicazione client usi valori dpidpi.First, make the client application dpidpi-aware. A tale scopo, chiamare la funzione Win32Win32 SetProcessDPIAware all'avvio.To do this, call the Win32Win32 function SetProcessDPIAware at startup. In codice gestito, la dichiarazione seguente rende disponibile questa funzione.In managed code, the following declaration makes this function available.

    [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
    

    Grazie a questa funzione, l'intero processo userà valori dpidpi, pertanto tutte le finestre appartenenti al processo non verranno ridimensionate.This function makes the entire process dpidpi-aware, meaning that all windows that belong to the process are unscaled. Nel Highlighter Sample, ad esempio, le quattro finestre che costituiscono il rettangolo di evidenziazione si trovano in corrispondenza delle coordinate fisiche ottenute Automazione interfaccia utenteUI Automation, non delle coordinate logiche.In the Highlighter Sample, for instance, the four windows that make up the highlight rectangle are located at the physical coordinates obtained from Automazione interfaccia utenteUI Automation, not the logical coordinates. Se nell'esempio non venissero usati valori dpidpi, l'evidenziazione verrebbe disegnata in corrispondenza delle coordinate logiche sul desktop, con la conseguenza di un posizionamento errato in un ambiente non a 96 dpidpi .If the sample were not dpidpi-aware, the highlight would be drawn at the logical coordinates on the desktop, which would result in incorrect placement in a non-96- dpidpi environment.

  2. Per ottenere coordinate del cursore, chiamare la funzione Win32Win32 GetPhysicalCursorPos.To get cursor coordinates, call the Win32Win32 function GetPhysicalCursorPos. Nell'esempio riportato di seguito viene illustrato come dichiarare e usare questa funzione.The following example shows how to declare and use this 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;
        }
    }
    
    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
    

Attenzione

Non utilizzare Cursor.Position.Do not use Cursor.Position. Il comportamento di questa proprietà al di fuori delle finestre client in un ambiente non ridimensionato non è definito.The behavior of this property outside client windows in a scaled environment is undefined.

Se nell'applicazione viene eseguita comunicazione tra processi diretta con applicazioni che non usano valori dpidpi, può essere necessario convertire le coordinate logiche e fisiche usando le funzioni Win32Win32 PhysicalToLogicalPoint e LogicalToPhysicalPoint.If your application performs direct cross-process communication with non- dpidpi-aware applications, you may have convert between logical and physical coordinates by using the Win32Win32 functions PhysicalToLogicalPoint and LogicalToPhysicalPoint.

Vedere ancheSee Also

Esempio evidenziatoreHighlighter Sample