Erfassen Sie Desktop- und Active Window-Screenshots in C#

Syed Hassan Sabeeh Kazmi 12 Oktober 2023
  1. Desktop-Screenshot in C# erstellen
  2. Screenshot des aktiven Fensters in C# erstellen
Erfassen Sie Desktop- und Active Window-Screenshots in C#

Das .Net-Framework kann die Screenshots in wenigen Codezeilen erfassen, ohne eine Skriptsprache zu verwenden. Es macht den kompletten C#-Code für Entwickler verständlich und leicht zu ändern.

In diesem Tutorial wird beschrieben, wie Sie ein einzelnes Bild der Anzeige oder des aktiven Fensters in C# erfassen.

In Windows 10 ist Windows.Graphics.Capture ein mächtiger Namespace, der verschiedene APIs zum Erfassen von Screenshots anbietet. Screenshots von Desktops und aktiven Fenstern fordern Entwickler auf, sichere Systembenutzeroberflächen für Endbenutzer zu erstellen.

Desktop-Screenshot in C# erstellen

Erstellen Sie in Visual Studio eine C#-Anwendung und nennen Sie sie Screenshot. Gehen Sie danach in die Toolbox und fügen Sie ein button1-Steuerelement zu Form1.cs [Design] hinzu, und der folgende Code ist nun in Form1.cs ausführbar.

// add the following directories
using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace Screenshot {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    // create a clieck event for the `Screenshot` button
    private void button1_Click(object sender, EventArgs e) {
      Screenshot();
    }
    private void Screenshot() {
      try {
        // set the screenshot resolution based on your monitor's resolution
        Bitmap captureBitmap = new Bitmap(1024, 768, PixelFormat.Format32bppArgb);
        Rectangle captureRectangle = Screen.AllScreens[0].Bounds;
        Graphics captureGraphics = Graphics.FromImage(captureBitmap);
        captureGraphics.CopyFromScreen(captureRectangle.Left, captureRectangle.Top, 0, 0,
                                       captureRectangle.Size);

        // select the save location of the captured screenshot
        captureBitmap.Save(@"E:\Capture.jpg", ImageFormat.Jpeg);

        // show a message to let the user know that a screenshot has been captured
        MessageBox.Show("Screenshot taken! Press `OK` to continue...");
      }

      catch (Exception ex) {
        MessageBox.Show("Error! " + ex.Message);
      }
    }
  }
}

Der erste Schritt bei der Implementierung einer Windows Form-Anwendung besteht darin, Ihrem C#-Projekt die Bildschirmaufnahmefunktion hinzuzufügen. Öffnen Sie Package.appxmaanifest im Solution Explorer und wählen Sie die Registerkarte Capabilities, um die Graphics Capture zu überprüfen.

Bevor Sie die Benutzeroberfläche des Systems starten, ist es wichtig zu überprüfen, ob Ihre C#-Anwendung Screenshots erstellen kann. Das Gerät, das die Hardwareanforderungen nicht erfüllt, oder das System, das keinen Zugriff auf Ihre Anwendung gewährt, kann die möglichen Gründe dafür sein, dass Ihre C#-Anwendung keine Screenshots erstellen kann.

Verwenden Sie die Methode IsSupported in der Klasse GraphicsCaptureSession, um festzustellen, ob Ihre C#-Anwendung Desktop- oder aktive Fenster-Screenshots erfassen kann.

public void OnInitialization() {
  // check if the C# application supports screen capture
  if (!GraphicsCaptureSession.IsSupported()) {
    // this will hide the visibility of the `Screenshot` button if your C# application does not
    // support the screenshot feature
    button1.Visibility = Visibility.Collapsed;
  }
}

Es ist möglich, einen Screenshot des Desktops mit allen geöffneten Fenstern mit der Methode CopyFromScreen() aus dem Graphics-Objekt in C# zu erstellen.

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace Screenshot {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      CaptureMyScreen();
    }
    private void CaptureMyScreen() {
      Rectangle rect = Screen.GetBounds(Point.Empty);
      using (Bitmap bitmap = new Bitmap(rect.Width, rect.Height)) {
        using (Graphics g = Graphics.FromImage(bitmap)) {
          g.CopyFromScreen(Point.Empty, Point.Empty, rect.Size);
        }
        // select the save location of the captured screenshot
        bitmap.Save(@"E://Capture.png", ImageFormat.Png);

        // show a message to let the user know that a screenshot has been captured
        MessageBox.Show("Screenshot taken! Press `OK` to continue...");
      }
    }
  }
}

Screenshot des aktiven Fensters in C# erstellen

Wenn mehrere laufende Anwendungen dazu führen, dass viele Fenster angezeigt werden, ist es wichtig, nur das aktive Fenster zu erfassen. Ein aktives Fenster ist dasjenige, das derzeit den Tastaturfokus hält.

Während die CopyFromScreen()-Methode aus dem Graphics-Objekt in C# einen Screenshot des Desktops erfassen kann, der alle geöffneten Fenster erfasst, erledigt die Verwendung von this.Bounds die Arbeit.

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace Screenshot {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      CaptureMyScreen();
    }
    private void CaptureMyScreen() {
      Rectangle rect = this.Bounds;
      using (Bitmap bitmap = new Bitmap(rect.Width, rect.Height)) {
        using (Graphics g = Graphics.FromImage(bitmap)) {
          g.CopyFromScreen(new Point(rect.Left, rect.Top), Point.Empty, rect.Size);
        }
        // select the save location of the captured screenshot
        bitmap.Save(@"E://Capture.png", ImageFormat.Png);

        // show a message to let the user know that a screenshot has been captured
        MessageBox.Show("Screenshot taken! Press `OK` to continue...");
      }
    }
  }
}

Dieses Tutorial behandelte drei Möglichkeiten zum Erfassen von Desktop-Screenshots, alle geöffneten und aktiven Fenster in C#. Es ist einfach, den obigen C#-Code nach Ihrem Geschmack anzupassen.

Es ist jedoch der am besten optimierte C#-Code zum Erfassen von Screenshots.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub