Mittwoch, 7. Juli 2010

Screenshot erstellen

Heute möchte ich euch mal zeigen, wie man mit der Programmiersprache C# einen Screenshot erstellt.
Ich fange direkt mit dem Quellcode einer dafür geschriebenen Funktion an, den ich im Anschluss erläutern werde:

private Bitmap TakeScreenshot(bool onlyForm)
{
int StartX, StartY;
int Width, Height;

StartX = (onlyForm) ? (this.Left) : (0);
StartY = (onlyForm) ? (this.Top) : (0);
Width = (onlyForm) ? (this.Width) : (Screen.PrimaryScreen.Bounds.Width);
Height = (onlyForm) ? (this.Height) : (Screen.PrimaryScreen.Bounds.Height);

Bitmap Screenshot = new Bitmap(Width, Height);
Graphics G = Graphics.FromImage(Screenshot);

G.CopyFromScreen(StartX, StartY, 0, 0, new Size(Width, Height), CopyPixelOperation.SourceCopy);
return Screenshot;
}

Die zum Erstellen eines Bildschirmabdrucks verwendete Funktion ist CopyFromScreen() aus der Klasse Graphics.
Mit der hier benutzten Überladung akzeptiert sie 6 Parameter. Als erste beiden werden hier StartX und StartY übergeben, sie bezeichnen die Koordinaten der linken oberen Ecke des abfotografierten Bereichs auf dem Bildschirm. Als Parameter 3 und 4 wird hier beide Male "0" übergeben, diese Parameter bezeichnen die Koordinaten der linken oberen Ecke des Screenshots auf der Leinwand. Werden hier also andere Werte übergeben, ist der Screenshot im resultierenden Bitmap verschoben. Der 5. Parameter legt die Größe des Screenshots fest und der 6. gibt an, dass die Punkte originalgetreu auf die Leinwand kopiert werden sollen.
Die geschriebene Funktion TakeScreenshot() erwartet eine Boolean Variable als Parameter. Ist sie auf false gesetzt, wird der komplette Bildschirm gedruckt (die Leinwandgröße und die Werte StartX und StartY werden entsprechend dem Formular gesetzt), andernfalls wird nur das aktive Formular gedruckt. Zur Fragezeichen - Schreibweise siehe hier.
Auf folgende Weise kann dann z.B. ein Screenshot des kompletten Bildschirms in eine PictureBox geladen werden:
pictureBox1.Image = TakeScreenshot(false);

Kommentare:

  1. Vor dem return noch ein G.Dispose() wär schön...

    AntwortenLöschen
  2. Warum eigendlich "return"? Ich weiß das heißt irgendwie das der dann nen Wert zurückgibt, aber wie genau kann ich das dann denn mir zur nutze machen? Also die Funktion gibt dann die Bitmap zurück aber in wie fern kann ich sie dann benutzen?

    LG Jonas

    AntwortenLöschen
    Antworten
    1. Hallo Jonas,

      das habe ich eigentlich aus "Schönheitszwecken" gemacht. Du denkst wahrscheinlich an eine konkrete Anwendung, die könnte man natürlich auch in die Funktion hereinschreiben, so ist es aber allgemeiner, die Funktion kann wieder verwendet werden und du benutzt einfach das Resultat.
      Um dann den Screenshot z.B. in eine PictureBox zu laden, reicht folgende Anweisung:
      pictureBox1.Image = TakeScreenshot(false);

      Löschen