Partager via


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

Mise à jour : novembre 2007

Windows Vista permet aux utilisateurs de modifier le paramètre points par pouce (ppp) afin que la plupart des éléments d'interface utilisateur (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 ppp 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 ppp ne revient pas à modifier la résolution d'écran. Avec la mise à l'échelle ppp, 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'interface utilisateur. 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 ppp, la taille d'un pouce vertical ou horizontal sur l'écran augmente de 25 pour cent. 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 pour cent. Si la mise à l'échelle d'application est activée et que l'application ne prend pas en compte le paramètre ppp, la taille de la fenêtre augmente dans les mêmes proportions, comme les offsets et la taille de tous les éléments d'interface utilisateur contenus.

Remarque :

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 ppp lorsque l'utilisateur affecte la valeur 120 au paramètre ppp, mais l'exécute lorsque la valeur du paramètre ppp 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.

Supposons que vous créiez une boîte de dialogue avec un bouton dont les coordonnées sont (100, 48). Lorsque cette boîte de dialogue s'affiche à 96 ppp par défaut, les coordonnées physiques du bouton sont (100, 48). À 120 ppp, ses coordonnées physiques sont (125, 60). Les coordonnées logiques sont par contre les mêmes pour tout paramètre ppp : (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 ppp. 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 ppp. 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 ppp.

Mise à l'échelle dans les clients UI Automation

L'APIUI 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 ppp 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 ppp. Pour ce faire, appelez la fonction Win32SetProcessDPIAware 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 ppp, ce qui signifie que toutes les fenêtres qui appartiennent au processus ne sont pas mises à l'échelle. Dans Surligneur, exemple, 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 ppp, la sélection serait dessinée sur le bureau aux coordonnées logiques, ce qui provoquerait un positionnement incorrect dans un environnement ppp non 96.

  2. Pour obtenir les coordonnées du curseur, appelez la fonction Win32GetPhysicalCursorPos. 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;
        }
    }
    
Attention :

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 ppp, une conversion est possible entre les coordonnées logiques et physiques à l'aide des fonctions Win32PhysicalToLogicalPoint et LogicalToPhysicalPoint.

Voir aussi

Tâches

Surligneur, exemple