Screenshot erstellen mit PowerShell und .NET
In einem früheren Beitrag haben wir gezeigt, wie man unter Windows mit einer Tastenkombination einen Screenshot erstellen kann. Doch auch mit PowerShell und .NET kann man einen Screenshot erstellen.
Screenshot erstellen mit PowerShell und Hilfe durch .NET
Ganz so komfortabel wie mit dem Windows Snipping Tool ist das Erstellen eines Screenshots mit PowerShell nicht. Denn mir ist derzeit nur eine Methode für den ganzen Bildschirm bekannt, aber nicht für einzelne Fenster. Die Vorgehensweise für eine Bildschirmaufnahme mit PowerShell wäre folgende:
- Bildschirm Höhe und Breite auslesen (Auflösung)
- Bitmap Objekt erstellen
- Grafik-Objekt aus der Bitmap erstellen
- Grafik-Objekt in Datei speichern
Auflösung des Bildschirms auslesen
Damit wir wissen wie groß der Screenshot werden soll, muss zuerst die Auflösung mit PowerShell ausgelesen werden. Hierbei hilft die Eigenschaft VirtualScreen.
$Screen = [System.Windows.Forms.SystemInformation]::VirtualScreen $Width = $Screen.Width $Height = $Screen.Height $Left = $Screen.Left $Top = $Screen.Top
Somit werden die Koordinaten ausgelesen, aber ebenfalls die Breite und Höhe in Pixel.
Bitmap Objekt erstellen
Um den Screenshot platzieren zu können, wird in PowerShell ein Bitmap Objekt benötigt. Hier helfen die vielen Funktionen von System.Drawing.Bitmap. Die wohl einfachste Methode ist die Angabe der Breite und Höhe in Pixel.
$bitmap = New-Object System.Drawing.Bitmap $Width, $Height
Grafik Objekt erstellen
Um ein Bitmap-Objekt mit PowerShell füllen zu können, wird ein Grafik Objekt benötigt. Für den Screenshot erstellen wir das Grafik-Objekt einfach aus dem Bitmap-Objekt, damit die gleiche Größe (Breite & Höhe) in Pixel verwendet wird.
$graphic = [System.Drawing.Graphics]::FromImage($bitmap)
Screenshot erstellen
Nun wird der eigentliche Screenshot erstellt. Hierfür wird CopyFromScreen des Grafik-Objekts verwendet. Natürlich müssen die Koordinaten angegeben werden und mit $bitmap.Size
die Größe des Screenshots.
$graphic.CopyFromScreen($Left, $Top, 0, 0, $bitmap.Size)
Screenshot speichern
Das aufgenommene Bild ist nun im Grafik-Objekt vorhanden. Doch natürlich möchte man den erstellten Screenshot in eine Datei abspeichern. Auch das ist relativ einfach umzusetzen:
$bitmap.Save("C:\users\YOURUSER\Desktop\YOURFILE.bmp")
Das komplette PowerShell Script zum Erstellen eines Screenshots unter Windows
Oben habe ich die einzelnen Schritte erklärt, wie man mit PowerShell und der Hilfe von .NET ein Hardcopy des Windows Desktops erstellen kann. Um auf die NET-Framework Ressourcen zugreifen zu können, müssen im Script noch die passenden AssemblyName´s hinzugefügt werden.
Add-Type -AssemblyName System.Windows.Forms Add-type -AssemblyName System.Drawing
Zusammengesetzt sollte das Script dann so aussehen:
$yourfile = "C:\users\USERNAME\Desktop\Screenshot.bmp" Add-Type -AssemblyName System.Windows.Forms Add-type -AssemblyName System.Drawing #Infos zur Aufloesung ermitteln $Screen = [System.Windows.Forms.SystemInformation]::VirtualScreen $Width = $Screen.Width $Height = $Screen.Height $Left = $Screen.Left $Top = $Screen.Top # Bitmap-Objekt mit der Aufloesung erzeugen $bitmap = New-Object System.Drawing.Bitmap $Width, $Height # Grafik-Objekt aus Bitmap erzeugen $graphic = [System.Drawing.Graphics]::FromImage($bitmap) # Screenshot aufnehmen $graphic.CopyFromScreen($Left, $Top, 0, 0, $bitmap.Size) # Datei speichern $bitmap.Save($yourfile)