C# Screenshot erstellen auf Multi-Monitor-Setup mit High-Dpi-Skalierung

Ghost_Rider_R

Lieutenant
Registriert
Nov. 2009
Beiträge
759
Hallo zusammen,

ich habe bei mir am Rechner 3 Bildschirme und möchte für jeden Bildschirm einen Screenshot erstellen.

Bildschirm 1:
Position: Mitte
Auflösung: 3840x2160
Skalierung: 175%

Bildschirm 2:
Position: Rechts
Auflösung: 3840x2160
Skalierung: 175%

Bildschirm 3:
Position: Links
Auflösung: 1280x800
Skalierung: 125%

Ich habe in C# nun diese Methode erstellt, aber das passt irgendwie nicht, da immer etwas abgeschnitten ist oder die Position nicht passt.
Ich drehe mich hier jetzt schon den ganzen Tag im Kreis herum und komm nicht weiter.
Hat hier jemand eine Idee?

//Code wurde entfernt!
//Aktueller Code steht in Post unten!

Vielen Dank schon mal für eure Hilfe!

LG Ghost
 
Zuletzt bearbeitet:
Sonst keiner ne Idee, wie das Problem gelöst werden kann?
ChatGPT weiß leider auch nicht weiter 😄
Ergänzung ()

Für mich wäre es eventuell auch ein Ansatz, wenn man die Windows-Screenshot-Funktion anzapfen könnte und dann einfach einen großen Screenshot erhält. Wäre das eventuell möglich?
Ergänzung ()

Ich habe einen für mich besseren Ansatz gefunden und würde diesen gerne verbessern, dann umgehen wir auch gleich ein paar Probleme auf einmal. Das ist der neue Code, welcher noch nicht ganz funktioniert:

C#:
    public Image ErstellenScreenshot()
    {
        try
        {
            double skalierungsFaktor = 1.25;
            int xPosition = Convert.ToInt32(SystemInformation.VirtualScreen.X * skalierungsFaktor);
            int yPosition = Convert.ToInt32(SystemInformation.VirtualScreen.Y * skalierungsFaktor);
            int breite = Convert.ToInt32(SystemInformation.VirtualScreen.Width * skalierungsFaktor);
            int hoehe = Convert.ToInt32(SystemInformation.VirtualScreen.Height * skalierungsFaktor);
            Rectangle rectangle = new(xPosition, yPosition, breite, hoehe);
            using Bitmap bitmap = new(rectangle.Width, rectangle.Height);
            using Graphics graphics = Graphics.FromImage(bitmap);
            graphics.CopyFromScreen(rectangle.Location, Point.Empty, rectangle.Size);
            return (Image)bitmap.Clone();
        }
        catch (Exception fehler)
        {
            throw new Exception("Der Screenshot konnte nicht erstellt werden." + fehler.Message);
        }
    }

Kann mir hier jemand helfen?
 
Zuletzt bearbeitet:
Ghost_Rider_R schrieb:
Sonst keiner ne Idee, wie das Problem gelöst werden kann?
ich würde die Skalierung der Monitore vorübergehend auf 100% setzen, um zu klären, ob die Werte dann passen bzw. die Skalierung überhaupt das Problem ist
Ghost_Rider_R schrieb:
Für mich wäre es eventuell auch ein Ansatz, wenn man die Windows-Screenshot-Funktion anzapfen könnte und dann einfach einen großen Screenshot erhält. Wäre das eventuell möglich?
ala via SendInput (Win32 Api) Taste Strg + Druck schicken, und dann die Zwischenablage auslesen ? ... ja, ist einen Versuch wert
Falls du Winforms präferierst, dort heißt es glaube SendKeys.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Ghost_Rider_R
Am Ende war die Lösung dann doch ganz einfach :-)

C#:
    public Image ErstellenScreenshot()
    {
        Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);
        int xPosition = SystemInformation.VirtualScreen.X;
        int yPosition = SystemInformation.VirtualScreen.Y;
        int breite = SystemInformation.VirtualScreen.Width;
        int hoehe = SystemInformation.VirtualScreen.Height;
        Rectangle rectangle = new(xPosition, yPosition, breite, hoehe);
        using Bitmap bitmap = new(rectangle.Width, rectangle.Height);
        using Graphics graphics = Graphics.FromImage(bitmap);
        graphics.CopyFromScreen(rectangle.Location, Point.Empty, rectangle.Size);
        return (Image)bitmap.Clone();
    }
 
  • Gefällt mir
Reaktionen: Micke
@Micke Genau, ein Bild über alle Screens. Das Image ist 4 Eckig und die Bildschirme haben die gleiche Anordnung wie in Windows. Bei unterschiedlichen Größen der Bildschirme werden nicht benutzte Flächen schwarz dargestellt.
 
  • Gefällt mir
Reaktionen: Micke
Zurück
Oben