Zu Content springen
Deutsch
  • Es gibt keine Vorschläge, da das Suchfeld leer ist.

Bildschirmauflösung per Skript auf Full HD setzen

"Workaround für TeamViewer 15 bei hochauflösenden Monitoren" "Automatische Auflösungsänderung durch TeamViewer verhindern" "Skript-basierter Workaround für 4K / UltraWide Monitore"

Beispiel-problem

Bei einer TeamViewer-Verbindung auf einen PC mit hochauflösendem Monitor (z.B. 3440×1440 oder 4K) schaltet TeamViewer die Auflösung des Zielrechners automatisch auf die native Monitorauflösung um – auch wenn in den TeamViewer-Einstellungen "Entfernte Auflösung: Nicht ändern" aktiviert ist.

Ursache

TeamViewer 15+ verwendet einen virtuellen Display-Adapter, der beim Verbindungsaufbau die Windows-Anzeigeeinstellungen überschreibt. Der Capture-Modus sowie der Mirror-Driver sind in neueren Versionen nicht mehr manuell konfigurierbar.

Das führt dazu, dass die Darstellung auf dem steuernden Laptop sehr groß und unübersichtlich wirkt.

Benötigte Dateien

Es werden zwei Dateien benötigt, die im selben Ordner liegen müssen (z.B. Desktop des Zielrechners):

  • bat – Startdatei (Doppelklick zum Ausführen)
  • ps1 – PowerShell-Skript mit der eigentlichen Logik


set_fullhd.bat:

@echo off

PowerShell -ExecutionPolicy Bypass -File "%~dp0set_fullhd.ps1"

 set_fullhd.ps1:  

Add-Type @"
using System;
using System.Runtime.InteropServices;

public class Display {
    [DllImport("user32.dll")]
    public static extern int ChangeDisplaySettings(ref DEVMODE devMode, int flags);

    [DllImport("user32.dll")]
    public static extern bool EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE devMode);

    [StructLayout(LayoutKind.Sequential)]
    public struct DEVMODE {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string dmDeviceName;
        public short dmSpecVersion;
        public short dmDriverVersion;
        public short dmSize;
        public short dmDriverExtra;
        public int dmFields;
        public int dmPositionX;
        public int dmPositionY;
        public int dmDisplayOrientation;
        public int dmDisplayFixedOutput;
        public short dmColor;
        public short dmDuplex;
        public short dmYResolution;
        public short dmTTOption;
        public short dmCollate;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string dmFormName;
        public short dmLogPixels;
        public int dmBitsPerPel;
        public int dmPelsWidth;
        public int dmPelsHeight;
        public int dmDisplayFlags;
        public int dmDisplayFrequency;
        public int dmICMMethod;
        public int dmICMIntent;
        public int dmMediaType;
        public int dmDitherType;
        public int dmReserved1;
        public int dmReserved2;
        public int dmPanningWidth;
        public int dmPanningHeight;
    }
}
"@

$devMode = New-Object Display+DEVMODE
$devMode.dmSize = [System.Runtime.InteropServices.Marshal]::SizeOf($devMode)

[Display]::EnumDisplaySettings($null, -1, [ref]$devMode) | Out-Null

$devMode.dmPelsWidth  = 1920
$devMode.dmPelsHeight = 1080
$devMode.dmFields     = 0x00080000 -bor 0x00100000  # DM_PELSWIDTH | DM_PELSHEIGHT

$result = [Display]::ChangeDisplaySettings([ref]$devMode, 0)

if ($result -eq 0) {
    Write-Host "Aufloesung erfolgreich auf 1920x1080 gesetzt."
} else {
    Write-Host "Fehler beim Aendern der Aufloesung. Code: $result"
}

$devMode.dmPelsWidth  = 1920
$devMode.dmPelsHeight = 1080


Hier kann man die Auflösung editieren/ festlegen.