C# Screenshot erstellen

  • C#

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    C# Screenshot erstellen

    Moin,

    Mein Screenshot-Programm soll vom ganzen Bildschirm ein Screenshot erstellen und dann abspeichern. (Dient zur einfachen Dokumentation einzelner Arbeitsprozesse...)

    Das schlimmste:
    Der Screenshot wird nicht vom ganzen Bildschirm erstellt (liegt das evtl an meinem 40Zoll-Bildschirm?)

    Nebenbei:
    Ich habe es nicht so mit den Schleifen, zwar funktioniert es, aber wie macht man das richtig?

    C#-Quellcode

    1. private void CmdScreenshot_Click(object sender, EventArgs e)
    2. {
    3. try
    4. {
    5. this.Opacity = 0;
    6. this.ShowInTaskbar = false;
    7. Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    8. using (Graphics g = Graphics.FromImage(bmp))
    9. {
    10. g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
    11. if (TxtName.Text.Length == 0)
    12. {
    13. for (int num = 0; num < 10000;)
    14. {
    15. if (File.Exists("screenshot" + num + ".jpg"))
    16. {
    17. num++;
    18. }
    19. else
    20. {
    21. bmp.Save("screenshot" + num + ".jpg");
    22. break;
    23. }
    24. }
    25. }
    26. else
    27. {
    28. if (File.Exists(TxtName.Text + ".jpg"))
    29. {
    30. bmp.Save(TxtName.Text + ".jpg");
    31. }
    32. else
    33. {
    34. MessageBox.Show("Dateiname existiert bereits");
    35. }
    36. }
    37. }
    38. this.Opacity = 100;
    39. this.ShowInTaskbar = true;
    40. }
    41. catch (Exception ex)
    42. {
    43. MessageBox.Show(ex.ToString());
    44. }
    45. }
    Wenn es dir auch um mehrere Bildschirme geht, dann kannst du mit ​SystemInformation.VirtualScreen die Größe erhalten, die alle Bildschirme enthält. Dann mit ​Top und ​Left die oberste linke Koordinate bestimmten. Außerdem mit ​g.Clear(Color.FromArgb(8, 8, 8)); das Bitmap Füllen, bevor du ​CopyFromScreen aufrufst. Aber dann sollte es eigentlich gehen.?
    @newsletter Du könntest der JPG einen Tag mitgeben.
    Allerdings geht das nicht in der System.Drawing.Bitmap, Du müsstest auf die PresentationFramework-Klassen umsteigen (das ist WPF, kannst Du aber alles in WinForm machen).
    docs.microsoft.com/de-de/dotne…e-and-decode-a-jpeg-image
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Noch ein Hinweis zu ​SystemInformation.VirtualScreen:
    Wenn mehrere Bildschirme angeschlossen sind, kann es passieren, dass der Nullpunkt nicht ganz links oben ist.
    Ich habe zum Beispiel einen externen Bildschirm links neben meinem Laptop, und einen weiteren rechts daneben stehen. Der im Laptop integrierte Bildschirm ist der primäre Bildschirm und hat in der Systemsteuerung die Nummer 1. Der Bildschirm rechts daneben die Nummer 2 und der Bildschirm links daneben die Nummer 3. Alle drei Bildschirme haben 1920x1080 Pixel.
    Der Nullpunkt ist links oben vom primären Bildschirm. SystemInformation.VirtualScreen gibt bei mir {X = -1920 Y = 0 Width = 5760 Height = 1080} zurück.
    Wenn Du bei CopyFromScreen für die ersten beiden Parameter einfach 0 angibst, dann wird in solchen Fällen nicht der komplette Bildschirm aufgenommen. Du musst X und Y von SystemInformation.VirtualScreen da angeben:

    VB.NET-Quellcode

    1. Dim Bounds = SystemInformation.VirtualScreen
    2. g.CopyFromScreen(Bounds.X, Bounds.Y, 0, 0, Bounds.Size)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils