Mise a l'echelle DPI et coordonnees d'ecran : pourquoi vos clics atterrissent au mauvais endroit

Vos parametres d'affichage — detection automatique :

Resolution physique
Resolution logique
DPR (Echelle)
Decalage de coordonnees

Vous avez ecrit un script qui clique a (960, 540) — ca marchait tres bien sur votre vieux moniteur 1080p. Puis vous etes passe a la 4K, Windows a regle la mise a l'echelle sur 150 %, et soudain le meme clic atterrit 480 pixels trop loin. Votre code n'a pas change. C'est le systeme de coordonnees en dessous qui a change.

La mise a l'echelle DPI est la raison la plus courante pour laquelle les coordonnees d'ecran « cassent » apres un changement de moniteur, un nouveau portable ou le glissement d'une fenetre entre des ecrans avec des mises a l'echelle differentes. Nous allons voir ce qui se passe reellement a 100 %, 125 %, 150 % et 200 % — et comment corriger ca dans vos scripts.

Ouvrir l'outil gratuit de coordonnees d'ecran

Votre mise a l'echelle DPI actuelle — en direct

Votre navigateur signale les informations suivantes sur votre affichage actuel :

Device Pixel Ratio
Taille d'ecran signalee
Pixels physiques estimes

Si le Device Pixel Ratio affiche 1,0, vous etes a 100 % de mise a l'echelle — les pixels logiques et physiques sont identiques. S'il affiche 1,5, vous etes a 150 % de mise a l'echelle et il y a une transformation de coordonnees invisible en cours. Utilisez notre outil de coordonnees d'ecran pour voir la difference entre vos positions logiques et physiques en temps reel.

Qu'est-ce que la mise a l'echelle DPI (et pourquoi existe-t-elle) ?

Un moniteur 4K de 27 pouces plaque 3840×2160 pixels dans a peu pres le meme espace physique qu'un ecran 1080p. Sans mise a l'echelle, le texte et les icones sont minuscules — environ 140 PPI contre ~92 PPI sur un ecran 1080p de 24 pouces. Lisible, mais fatigant pour les yeux.

Alors Windows applique une mise a l'echelle DPI. Reglez-la a 150 % sur ce moniteur 4K et Windows pretend que l'ecran ne fait que 2560×1440. Il dessine tout a cette taille plus petite, puis l'etire pour remplir les 3840×2160 complets. Resultat : l'interface a une taille confortable, mais avec un rendu plus net parce que chaque pixel « logique » correspond a 1,5 × 1,5 = 2,25 pixels physiques.

Le probleme : La plupart des logiciels (et la plupart des outils d'automatisation) ne voient que l'espace de coordonnees logiques. Ils pensent que l'ecran fait 2560×1440 alors qu'il fait en realite 3840×2160. Cela provoque un decalage entre l'endroit ou vous pensez cliquer et l'endroit ou le clic s'enregistre reellement.

Pour une explication plus approfondie de ce que sont les pixels « physiques » et « logiques » et leurs liens avec les pixels CSS, les device pixels et les pixels independants du peripherique, consultez notre guide Pixels physiques vs logiques.

Resolution logique vs physique pour chaque facteur d'echelle

Tableau de reference — trouvez votre resolution physique a gauche, puis lisez vers la droite pour voir ce que Windows signale reellement aux applications a chaque facteur d'echelle :

Resolution physique100 % (Logique)125 % (Logique)150 % (Logique)200 % (Logique)
1920×10801920×10801536×8641280×720960×540
2560×14402560×14402048×11521707×9601280×720
3440×14403440×14402752×11522293×9601720×720
3840×21603840×21603072×17282560×14401920×1080

Comment lire ce tableau : Si vous avez un moniteur 4K (3840×2160) a 150 % de mise a l'echelle, les applications non sensibles au DPI voient un ecran de 2560×1440. Quand une telle application demande « quelle est la largeur de l'ecran ? », elle obtient 2560 — pas 3840. Quand elle clique a la coordonnee (1280, 720), Windows traduit cela en pixel physique (1920, 1080) avant de l'envoyer a l'affichage.

C'est pourquoi vos scripts de comparatif de resolution d'ecran peuvent signaler des valeurs inattendues — ils voient la resolution logique, pas la physique.

Le probleme de decalage de coordonnees : ou votre clic atterrit vraiment

Mettons les choses au concret. Vous voulez cliquer au centre de votre ecran 4K — c'est le pixel physique (1920, 1080). Mais votre outil d'automatisation ne sait rien de la mise a l'echelle DPI. Il calcule le centre de ce qu'il voit — l'espace logique de 2560×1440 — et clique a (1280, 720). Windows met ensuite ce clic a l'echelle :

Clic physique = clic logique × facteur d'echelle
Clic physique = (1280, 720) × 1,5
Clic physique = (1920, 1080)  ← correct par coincidence !

Dans ce cas, ca marche — et ce n'est pas de la chance. La virtualisation DPI de Windows met les coordonnees a l'echelle de maniere uniforme, donc toute position calculee comme une proportion de l'ecran (centre = 50 %, coins = 0 % ou 100 %) correspond correctement quelle que soit la mise a l'echelle. La catastrophe arrive quand vous ciblez une position absolue — un bouton, une icone, un pixel specifique — qui n'est pas un simple ratio de la taille de l'ecran :

Vous voulez cliquer (Physique)Votre script envoie (Logique @ 150 %)Le systeme met a l'echelle vers (Physique)Resultat
(500, 300)(500, 300)(750, 450)250 px de decalage
(960, 540)(960, 540)(1440, 810)480 px de decalage
(1920, 1080)(1280, 720)(1920, 1080)Correct

Le constat est clair : si votre script utilise des coordonnees d'un systeme mais que l'application cible en utilise un autre, chaque clic est decalé du facteur de mise a l'echelle. Le decalage s'aggrave plus vous vous eloignez de (0, 0).

Scenarii reel : Vous utilisez PyAutoGUI pour cliquer sur un bouton a la position logique (500, 300) sur un ecran a 150 % de mise a l'echelle. Votre script n'est pas sensible au DPI, donc pyautogui.position() renvoie (500, 300). Mais le bouton est en realite a la position physique (750, 450). Votre clic atterrit a (750, 450) — ce qui est faux si le bouton se trouve dans une application sensible au DPI comme Chrome qui se positionne en utilisant des coordonnees physiques.

Le correctif : SetProcessDPIAware et sensibilisation DPI

Le correctif tient en un seul appel d'API — dites a Windows que votre application comprend la haute densite et veut les pixels physiques :

// C / C++ (API Windows)
SetProcessDPIAware();

// C# (.NET)
[DllImport("user32.dll")]
static extern bool SetProcessDPIAware();
SetProcessDPIAware();

// Python (ctypes)
import ctypes
ctypes.windll.user32.SetProcessDPIAware()

// Python (recommande pour les versions recentes de Windows)
import ctypes
ctypes.windll.shcore.SetProcessDpiAwareness(2)  // PROCESS_PER_MONITOR_DPI_AWARE

// Python (recommande pour Windows 10 1703+ et Windows 11)
import ctypes
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = ctypes.c_void_p(-4)
ctypes.windll.user32.SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)

Apres cet appel, les fonctions de coordonnees renvoient des valeurs en pixels physiques au lieu de valeurs logiques. pyautogui.size() renverra 3840×2160 au lieu de 2560×1440. pyautogui.position() renverra les vraies positions en pixels. Et vos clics atterriront exactement la ou vous le souhaitez.

Quel appel utiliser ?

APIComportementIdeal pour
SetProcessDPIAware()Sensibilisation DPI au niveau systeme. Obtient la resolution physique du moniteur principal.Configurations mono-ecran avec un seul facteur d'echelle.
SetProcessDpiAwareness(2)Sensibilisation DPI par moniteur. Obtient la vraie resolution physique de chaque moniteur.Configurations multi-ecrans avec DPI mixte (Windows 8.1+).
SetProcessDpiAwarenessContext(-4)Sensibilisation DPI par moniteur V2. Pareil que ci-dessus, plus corrige les bugs de mise a l'echelle de la barre de titre et des zones non-clientes sur les configurations DPI mixtes.Recommande pour Windows 10 1703+ et Windows 11. Consultez notre guide Coordonnees multi-ecrans.

Manifeste d'application (sans code necessaire)

Si vous developpez une application Windows, vous pouvez declarer la sensibilisation DPI dans votre fichier manifeste au lieu d'appeler l'API :

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <asmv3:application>
    <asmv3:windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Pour le correctif complet specifique a PyAutoGUI avec la prise en charge multi-ecran et les decalages de region de capture, consultez notre guide Coordonnees PyAutoGUI.

Multi-ecran DPI mixte : quand ca devient vraiment le bazar

Deux moniteurs, des facteurs d'echelle differents — par exemple un portable 4K a 150 % et un ecran externe 1080p a 100 %. La transformation de coordonnees change au fur et a mesure que votre curseur se deplace d'un ecran a l'autre :

Ce type de configuration est un cauchemar pour l'automatisation. Mais la solution est toujours la meme : appelez SetProcessDpiAwareness(2) pour la sensibilisation DPI par moniteur, et vous obtiendrez les vraies coordonnees physiques pour le moniteur sur lequel se trouve votre curseur. Les formules completes pour les configurations DPI mixtes se trouvent dans notre guide Coordonnees multi-ecrans.

Questions frequentes

macOS a-t-il le meme probleme de mise a l'echelle DPI ?

En quelque sorte, mais macOS le gere plus proprement. Les ecrans Retina ont un facteur de base de 2×, et les applications recoivent des coordonnees en « points » (pixels logiques). Cependant, les utilisateurs peuvent choisir des modes d'affichage comme « Plus d'espace » ou « Texte plus grand » dans les Reglages Systeme, ce qui resulte en des facteurs d'echelle effectifs comme 1,5× ou 2,4× — le devicePixelRatio de votre navigateur le reflètera. La plupart des outils d'automatisation Mac — AppleScript, Hammerspoon — gerent la conversion automatiquement, donc vous rencontrez beaucoup moins souvent le probleme de decalage sur macOS.

Et sous Linux ?

Les serveurs d'affichage Linux (X11 et Wayland) gerent la mise a l'echelle DPI differemment selon le compositeur et l'environnement de bureau. Sur X11, la mise a l'echelle est souvent geree par application via Xft.dpi ou des variables d'environnement. Sur Wayland, le compositeur s'en charge. Le comportement des coordonnees varie enormement — il n'existe pas d'equivalent universel a SetProcessDPIAware(). Testez vos scripts sur votre configuration Linux specifique.

Pourquoi PyAutoGUI renvoie-t-il une mauvaise taille d'ecran ?

pyautogui.size() renvoie la resolution logique par defaut sous Windows. Sur un ecran 4K a 150 % de mise a l'echelle, il renvoie 2560×1440 au lieu de 3840×2160. Appelez ctypes.windll.user32.SetProcessDPIAware() avant d'importer PyAutoGUI, et il renverra la vraie resolution physique. Consultez notre guide Coordonnees PyAutoGUI pour la configuration complete.

Comment verifier mon facteur de mise a l'echelle Windows actuel ?

Faites un clic droit sur votre bureau → Parametres d'affichage → cherchez Mise a l'echelle et disposition. Le pourcentage affiche (100 %, 125 %, 150 %, 200 %) est votre facteur de mise a l'echelle. Divisez par 100 pour obtenir le multiplicateur. Ou utilisez notre outil ci-dessus — il detecte votre DPR automatiquement.

Puis-je simplement regler la mise a l'echelle a 100 % et eviter tout ca ?

Bien sur, mais sur un moniteur 4K tout sera minuscule. Un ecran 4K de 27 pouces a 100 % vous donne environ 140 PPI — lisible mais pas agreable pour une utilisation prolongee. Vous reglez un probleme (les coordonnees) mais vous en creez un autre (la fatigue oculaire). Rendre vos scripts sensibles au DPI est la meilleure approche.

Associe : Verifier vos coordonnees ? Notre tutoriel montre comment le DPI affecte chaque methode.

Ouvrir le traqueur de coordonnees en direct Correctif coordonnees PyAutoGUI