Partager via


Mise à l'échelle de l'écran et UI Automation

RemarqueRemarque

Cette documentation s'adresse aux développeurs .NET Framework qui veulent utiliser les classes UI Automation managées définies dans l'espace de noms System.Windows.Automation.Pour obtenir les informations les plus récentes sur UI Automation, consultez API Windows Automation : UI Automation (page éventuellement en anglais).

Windows Vista permet aux utilisateurs de modifier le paramètre dots per inch (dpi) afin que la plupart des éléments d'user interface (UI) de l'écran apparaissent dans une taille plus grande. Bien que cette fonctionnalité ait longtemps été disponible dans Microsoft Windows, dans les versions précédentes, la mise à l'échelle devait être implémentée par les applications. Dans Windows Vista, le Gestionnaire de fenêtrage exécute la mise à l'échelle par défaut pour toutes les applications qui ne gèrent pas leur propre mise à l'échelle. Les applications du client UI Automation doivent prendre cette fonctionnalité en considération.

Cette rubrique comprend les sections suivantes.

  • Mise à l'échelle dans Windows Vista
  • Mise à l'échelle dans les clients UI Automation
  • Rubriques connexes

Mise à l'échelle dans Windows Vista

Le paramètre dpi par défaut est 96, ce qui signifie que 96 pixels occupent la largeur ou la hauteur d'un pouce notional. La mesure exacte d'un "pouce" dépend de la taille et de la résolution physique du moniteur. Par exemple, sur un moniteur d'une largeur de 12 pouces, à une résolution horizontale de 1280 pixels, une ligne horizontale de 96 pixels correspond approximativement aux 9/10 d'un pouce.

La modification du paramètre dpi ne revient pas à modifier la résolution d'écran. Avec la mise à l'échelle dpi, le nombre de pixels physiques sur l'écran reste le même. Toutefois, la mise à l'échelle est appliquée à la taille et à l'emplacement des éléments d'UI. Cette mise à l'échelle peut être exécutée automatiquement par le Gestionnaire de fenêtrage (DWM, Desktop Window Manager) pour le bureau et pour les applications qui ne refusent pas explicitement la mise à l'échelle.

En fait, lorsque l'utilisateur définit le facteur d'échelle à 120 dpi, la taille d'un pouce vertical ou horizontal sur l'écran augmente de 25 %. Toutes les dimensions sont mises à l'échelle en conséquence. L'offset d'une fenêtre d'application, à partir des bords gauche et supérieur de l'écran, augmente de 25 %. Si la mise à l'échelle d'application est activée et que l'application ne prend pas en compte le paramètre dpi, la taille de la fenêtre augmente dans les mêmes proportions, comme les offsets et la taille de tous les éléments d'UI contenus.

RemarqueRemarque

Par défaut, le Gestionnaire de fenêtrage n'exécute pas de mise à l'échelle pour les applications ne prenant pas en compte le paramètre dpi lorsque l'utilisateur affecte la valeur 120 au paramètre dpi, mais l'exécute lorsque la valeur du paramètre dpi est une valeur personnalisée supérieure ou égale à 144.Toutefois, l'utilisateur peut substituer le comportement par défaut.

La mise à l'échelle de l'écran engendre de nouveaux défis pour les applications concernées, d'une manière ou d'une autre, par les coordonnées d'écran. L'écran contient maintenant deux systèmes de coordonnées : physique et logique. Les coordonnées physiques d'un point correspondent à l'offset réel en pixels, à partir de l'angle supérieur gauche de l'origine. Les coordonnées logiques correspondent aux offsets tels qu'ils seraient si les pixels eux-mêmes étaient mis à l'échelle.

Supposez que vous concevez une boîte de dialogue avec un bouton aux coordonnées (100, 48). Lorsque cette boîte de dialogue est affichée avec la résolution par défaut de 96 dpi, le bouton se trouve aux coordonnées physiques (100, 48). Avec une résolution de 120 dpi, il se trouve aux coordonnées physiques (125, 60). Toutefois, les coordonnées logiques sont les mêmes quelle que soit la résolution en dpi : (100, 48).

Les coordonnées logiques sont importantes, car elles rendent cohérent le comportement du système d'exploitation et des applications, quel que soit le paramètre dpi. Par exemple, Cursor.Position retourne normalement les coordonnées logiques. Si vous déplacez le curseur sur un élément dans une boîte de dialogue, les mêmes coordonnées sont retournées, quel que soit le paramètre dpi. Si vous dessinez un contrôle à la position (100, 100), il apparaît au niveau de ces coordonnées logiques et occupera la même position relative pour tout paramètre dpi.

Mise à l'échelle dans les clients UI Automation

L'API UI Automation n'utilise pas de coordonnées logiques. Les méthodes et propriétés suivantes retournent des coordonnées physiques ou les utilisent comme paramètres.

Par défaut, une application du client UI Automation exécutée dans un environnement dpi non 96 ne pourra pas obtenir de résultats corrects à partir de ces méthodes et propriétés. Par exemple, étant donné que la position du curseur correspond à des coordonnées logiques, le client ne peut pas simplement passer ces coordonnées à FromPoint pour obtenir l'élément situé sous le curseur. De plus, l'application ne pourra pas placer correctement des fenêtres à l'extérieur de sa zone cliente.

La solution est constituée de deux parties.

  1. Tout d'abord, faites en sorte que l'application cliente prenne en compte le paramètre dpi. Pour ce faire, appelez la fonction Win32 SetProcessDPIAware au démarrage. Dans le code managé, la déclaration suivante rend cette fonction 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();
    

    Cette fonction permet à l'ensemble du processus de prendre en compte le paramètre dpi, ce qui signifie que toutes les fenêtres qui appartiennent au processus ne sont pas mises à l'échelle. Dans Highlighter Sample, par exemple, les quatre fenêtres qui composent le rectangle de sélection sont localisées aux coordonnées physiques obtenues via UI Automation, et non aux coordonnées logiques. Si l'exemple ne prenait pas en compte le paramètre dpi, la sélection serait dessinée sur le bureau aux coordonnées logiques, ce qui provoquerait un positionnement incorrect dans un environnement dpi non 96.

  2. Pour obtenir les coordonnées du curseur, appelez la fonction Win32 GetPhysicalCursorPos. L'exemple suivant montre comment déclarer et utiliser cette fonction.

    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;
        }
    }
    
Remarque AttentionAttention

N'utilisez pas Cursor.Position.Le comportement de cette propriété en dehors des fenêtres clientes dans un environnement mis à l'échelle est indéfini.

Si votre application exécute la communication interprocessus directe avec des applications ne prenant pas en compte le paramètre dpi, une conversion est possible entre les coordonnées logiques et physiques à l'aide des fonctions Win32 PhysicalToLogicalPoint et LogicalToPhysicalPoint. 

Voir aussi

Tâches

Highlighter Sample