PyAutoGUI-Koordinaten-Leitfaden: size(), Multi-Monitor, DPI-Skalierungs-Fixes

Was PyAutoGUI auf Ihrem Bildschirm sehen würde:

Physische Auflösung
Was PyAutoGUI sieht (ohne Fix)
DPR
Klick-Offset (Worst Case)

pyautogui.size() gibt Ihre Bildschirmabmessungen zurück, pyautogui.position() liefert die aktuelle Mausposition, und pyautogui.click(960, 540) klickt auf die Mitte eines 1920×1080-Bildschirms — aber nur wenn die DPI-Skalierung deaktiviert ist. Wenn Sie pyautogui.click(960, 540) geschrieben haben und der Klick woanders landete, oder pyautogui.locateOnScreen() falsche Koordinaten zurückgibt, haben Sie den häufigsten PyAutoGUI-Koordinaten-Bug. Unten erklären wir, wie pyautogui.size() funktioniert, Multi-Monitor-Koordinatenbereiche, und die komplette DPI-Skalierungs-Lösung.gui.locateOnScreen() liefert falsche Koordinaten. Oder Ihr Screenshot erfasst den falschen Bereich. Bekannt?

Das sind die drei klassischen PyAutoGUI-Koordinaten-Bugs, und sie haben eine gemeinsame Ursache: DPI-Skalierung + Multi-Monitor-virtuelle Bildschirmkoordinaten. Wir behandeln alle drei unten — mit Code, den Sie direkt in Ihr Projekt kopieren können. Die Werte Ihres Bildschirms werden oben ermittelt.

Kostenloses Bildschirmkoordinaten-Tool öffnen

Die drei PyAutoGUI-Koordinaten-Bugs

PyAutoGUI-Koordinatenprobleme lassen sich fast immer einer dieser drei Kategorien zuordnen:

  1. Klick-Offset auf hochauflösenden Displays: pyautogui.click(960, 540) landet nicht dort, wo Sie es erwarten, weil PyAutoGUI logische Koordinaten verwendet, während die Zielanwendung physische Koordinaten nutzt. Behandelt in unserem DPI-Skalierungs-Leitfaden.
  2. Falsche Bildschirmgröße gemeldet: pyautogui.size() gibt 2560×1440 auf Ihrem 4K-Display zurück, weil Windows ihm die logische (skalierte) Auflösung liefert. Ihre Skripte berechnen falsche Mittelpunkte, falsche Prozentwerte — einfach alles.
  3. Screenshot-Region-Versatz: pyautogui.screenshot(region=(x, y, w, h)) erfasst einen anderen Bereich als den angegebenen, weil die Regionskoordinaten im logischen Raum liegen, der Screenshot aber den physischen Pixelbuffer verwendet.

Alle drei Bugs haben dieselbe Ursache: PyAutoGUI läuft unter Windows standardmäßig als nicht-DPI-fähiger Prozess. Das Betriebssystem liefert ihm logische Koordinaten. Die Lösung ist immer dieselbe — DPI-Awareness aktivieren.

pyautogui.size() vs. Ihre echte Auflösung

Was liefert pyautogui.size() tatsächlich auf einem 4K-Display? Das hängt von Ihrer Skalierung ab:

Physische AuflösungWindows-Skalierungpyautogui.size() liefertFehlende Pixel
3840×2160100%3840×2160 ✓Keine
3840×2160125%3072×1728768×432 Pixel daneben
3840×2160150%2560×14401280×720 Pixel daneben
3840×2160200%1920×10801920×1080 Pixel daneben
2560×1440125%2048×1152512×288 Pixel daneben
2560×1440150%1707×960853×480 Pixel daneben

Bei 150 % Skalierung auf 4K denkt PyAutoGUI, Ihr Bildschirm sei nur 2560 Pixel breit. Wenn es das als Mitte ansieht und auf (1280, 720) klickt, übersetzt Windows das in den physischen Pixel (1920, 1080) — was zufällig die echte Mitte ist. Aber jede andere Position wird um den Skalierungsfaktor danebenliegen.

Die Komplettlösung: DPI-fähiges PyAutoGUI-Setup

Setzen Sie das an den Anfang Ihres Skripts — vor dem Import von PyAutoGUI:

import ctypes
import sys

# Fix #1: Windows mitteilen, dass wir echte physische Pixel wollen
if sys.platform == 'win32':
    try:
        # Per-Monitor-DPI-Awareness (optimal für Multi-Monitor)
        ctypes.windll.shcore.SetProcessDpiAwareness(2)
    except Exception:
        # Fallback: Systemweite DPI-Awareness
        ctypes.windll.user32.SetProcessDPIAware()

# JETZT PyAutoGUI importieren — es sieht jetzt echte Pixel
import pyautogui

# Prüfen, ob der Fix funktioniert hat
w, h = pyautogui.size()
print(f"Screen size: {w}×{h}")
# Auf einem 4K-Display mit 150 % sollte jetzt 3840×2160 stehen

Warum SetProcessDpiAwareness(2) statt SetProcessDPIAware()?

AufrufStufeMulti-MonitorVerwenden bei
SetProcessDPIAware()SystemVerwendet die DPI des primären Monitors für alle MonitoreNur Einzelmonitor
SetProcessDpiAwareness(2)Per-MonitorJeder Monitor meldet seine echte physische AuflösungJedes Setup (empfohlen)

Wenn Sie einen 4K-Laptopbildschirm mit 150 % und einen externen 1080p-Monitor mit 100 % haben, stellt SetProcessDpiAwareness(2) sicher, dass PyAutoGUI auf dem Laptop 3840×2160 und auf dem externen Monitor 1920×1080 sieht — die echten Werte für jedes Display. Mehr dazu, wie Koordinaten über verschiedene Monitore hinweg funktionieren, in unserem Multi-Monitor-Koordinaten-Leitfaden.

Screenshot-Region-Offsets korrigieren

Das Screenshot-Region-Problem ist tückisch. Ohne den DPI-Fix verwendet der region-Parameter logische Koordinaten — und dann passiert Folgendes (Beispiel assumes 150 % Skalierung auf einem 4K-Display; Ihr ermittelter DPR kann abweichen):

# OHNE den Fix (150 % Skalierung auf 4K):
# Sie wollen die oberen linken 960×540 Pixel erfassen
img = pyautogui.screenshot(region=(0, 0, 960, 540))
# Tatsächlich erfasst es die logischen oberen 960×540
# was physisch (0, 0, 1440, 810) entspricht — deutlich mehr als gewollt

# MIT SetProcessDpiAwareness(2):
# Jetzt verwendet die Region korrekt physische Pixel
img = pyautogui.screenshot(region=(0, 0, 960, 540))
# Erfasst exakt die oberen linken 960×540 physischen Pixel ✓

Wichtig: Nach Aktivierung der DPI-Awareness liefert pyautogui.screenshot() ein Bild mit voller physischer Auflösung. Auf einem 4K-Display also ein 3840×2160-Bild, nicht 2560×1440. Wenn Sie Screenshots vor dem Fix zugeschnitten haben, müssen Sie Ihre Zuschnittskoordinaten auf physische Pixel aktualisieren.

Multi-Monitor: Virtuelle Bildschirmkoordinaten erklärt

In einem Multi-Monitor-Setup arbeitet PyAutoGUI mit einem einzigen virtuellen Bildschirm, der sich über alle Ihre Monitore erstreckt. Der primäre Monitor beginnt bei (0, 0). Die anderen setzen sich daran fort:

# Virtuelle Bildschirmgröße prüfen
import ctypes
import pyautogui

# Nach DPI-Fix:
print(pyautogui.size())   # Größe des primären Monitors
x, y = pyautogui.position()
print(f"Current mouse position: ({x}, {y})")
# Negative Werte bedeuten: Sie sind auf einem Monitor links/oberhalb

Die vollständige Koordinatenmathematik zur Berechnung der Mitte, Offsets und Randpositionen jedes Monitors finden Sie in unserem Multi-Monitor-Koordinaten-Leitfaden.

Warum locateOnScreen() falsche Koordinaten liefert

pyautogui.locateOnScreen('button.png') ist eine der nützlichsten PyAutoGUI-Funktionen — und eine der fehleranfälligsten auf hochauflösenden Displays. Das Problem (Beispiel assumes 150 % Skalierung auf einem 4K-Display):

  1. Sie machen einen Screenshot eines Buttons auf Ihrem 4K-Display (das Bild hat 3840×2160 physische Pixel)
  2. Sie schneiden den Button aus und speichern ihn als button.png
  3. locateOnScreen() macht einen Screenshot — aber ohne DPI-Awareness liefert Windows ein logisch skaliertes Bild (2560×1440), das vom Betriebssystem hochskaliert und unscharf wurde (DPI-Virtualisierung). Die Pixel stimmen nicht mehr exakt mit Ihrem Referenzbild überein.
  4. Es versucht, Ihren scharfen 4K-ausgeschnittenen Button in diesem unscharfen, verkleinerten Screenshot zu finden — und scheitert oder liefert falsche Koordinaten.

Die Lösung: Nach dem Aufruf von SetProcessDpiAwareness(2) erfasst PyAutoGUIs interner Screenshot rohe physische Pixel ohne OS-Resampling. Ihr Referenzbild und der Such-Screenshot sind jetzt auf derselben Auflösung und Schärfe, sodass locateOnScreen() korrekt funktioniert.

Tipp: Erstellen Sie Ihre Referenzbilder immer nach der Aktivierung der DPI-Awareness. Wenn Sie sie vorher erfasst haben, liegen sie in logischer Auflösung vor und passen nicht zu den physischen Pixel-Screenshots.

Fertiges Skript zum direkten Einsatz

Kopieren Sie dieses Skript in Ihr Projekt. Es kümmert sich um DPI-Awareness, Multi-Monitor-Erkennung und bietet Hilfsfunktionen für auflösungsunabhängige Klicks:

"""
PyAutoGUI DPI-fähiges Setup — oben in jedes Skript kopieren.
Funktioniert auf Windows, macOS und Linux. Multi-Monitor-sicher.

WICHTIG: DPI-Awareness MUSS vor dem Import von pyautogui gesetzt werden,
da dieser die logische Auflösung beim Import zwischenspeichert.
"""
import ctypes
import sys

# --- DPI-Awareness VOR dem Import von pyautogui setzen ---
if sys.platform == 'win32':
    try:
        ctypes.windll.shcore.SetProcessDpiAwareness(2)
    except Exception:
        try:
            ctypes.windll.user32.SetProcessDPIAware()
        except Exception:
            pass

# JETZT ist es sicher, pyautogui zu importieren
import pyautogui

def get_screen_info():
    """Liefert nützliche Bildschirminformationen."""
    w, h = pyautogui.size()
    return {
        'width': w,
        'height': h,
        'center': (w // 2, h // 2),
        'total_pixels': w * h,
    }

def click_relative(x_pct, y_pct):
    """Klickt an einem Prozentwert der Bildschirmgröße (0.0 bis 1.0).
    Auflösungsunabhängig — funktioniert auf jedem Bildschirm."""
    w, h = pyautogui.size()
    pyautogui.click(int(w * x_pct), int(h * y_pct))

# --- Anwendung ---
info = get_screen_info()
print(f"Primary screen: {info['width']}×{info['height']}")
print(f"Center: {info['center']}")

# Beispiel: Bildschirmmitte anklicken
click_relative(0.5, 0.5)

Häufig gestellte Fragen

Funktioniert dieser Fix auch auf macOS und Linux?

SetProcessDpiAwareness() existiert nur unter Windows. Unter macOS handhabt PyAutoGUI die Retina-Skalierung gut genug. Unter Linux hängt es vom Display-Server ab (X11 vs. Wayland). Die Funktion setup_dpi_awareness() oben kann überall sicher aufgerufen werden — sie tut einfach nichts auf Nicht-Windows-Systemen.

Warum funktioniert mein Skript in IDLE, aber nicht bei direkter Ausführung?

Einige IDEs — darunter IDLE — sind bereits DPI-fähig. Wenn Sie Ihr Skript darin ausführen, erbt es diesen Kontext. Führen Sie dasselbe Skript von der Kommandozeile oder dem Taskplaner aus, startet es als nicht-DPI-fähiger Prozess. Rufen Sie SetProcessDpiAwareness(2) immer auf, unabhängig davon, wie Sie starten.

Kann ich das mit PyAutoGUI + OpenCV zusammen verwenden?

Ja. Nach der Aktivierung der DPI-Awareness liefert pyautogui.screenshot() ein Bild in voller Auflösung als PIL-Image. Sie können es in ein NumPy-Array für die OpenCV-Verarbeitung umwandeln. Die Koordinaten aus cv2.matchTemplate() stimmen dann mit PyAutoGUIs physischem Pixel-Koordinatenraum überein.

Was passiert, wenn SetProcessDpiAwareness(2) einen Fehler wirft?

Das kann fehlschlagen, wenn Ihr Prozess bereits als DPI-unfähig markiert wurde (z. B. wenn Python von einem nicht-DPI-fähigen Elternprozess gestartet wurde). Der Fallback ist SetProcessDPIAware(). Wenn auch das fehlschlägt, laufen Sie wahrscheinlich in einem Kontext, in dem DPI-Awareness vom Elternprozess geerbt wird — prüfen Sie Ihren Python-Launcher oder Ihre Terminal-Einstellungen.

Wie erhalte ich meine Mauskoordinaten, um den Fix zu verifizieren?

Führen Sie print(pyautogui.position()) nach dem Aufruf von setup_dpi_awareness() aus. Bewegen Sie Ihre Maus in die rechte untere Ecke Ihres Bildschirms — es sollte etwa (width-1, height-1) anzeigen, wobei width/height die physische Auflösung ist. Oder nutzen Sie unser Online-Bildschirmkoordinaten-Tool, um Ihre Position in Echtzeit zu sehen.

Verwandt: Koordinaten fuer Ihr PyAutoGUI-Skript benoetigt? Siehe unsere Anleitung zum Finden von Pixelkoordinaten.

Verwandt: Klick-Ziele erfassen? Unser Detektor protokolliert Koordinaten fuer PyAutoGUI.

Live-Bildschirmkoordinaten-Tracker öffnen DPI-Skalierung & Koordinaten-Leitfaden