Screenshot erstellen

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von programmer71.

    Screenshot erstellen

    Hallo
    ich habe per SuFu leider nichts genaueres gefunden außer Screenshots eines Fensters zu machen.
    Ich brauche einfach nur eine Funktion, die meinen kompletten Bildschirm einmal screened und diesen Screenshot dann abspeichert.
    Der Name für das Bild soll zufällig gewählt werden z.B. mit der Random Funktion. Mein Programm soll nämlich jede Minute einen Screenshot erstellen.

    Ich hoffe jemand kann mir helfen.

    Grüße
    shocK
    Danke erstmal.
    Blick nicht ganz durch diese Funktion durch.

    Wäre es nicht einfacher irgendwas in der Art zu machen?

    VB.NET-Quellcode

    1. SendKeys.Send("{PRTSC}")
    2. CType(Clipboard.GetImage, IDataObject)


    Das ganze dann irgendwie in eine Datei speichern. Weiß nur nicht wie
    Mit meiner Methode brauche ich nur 4 Zeilen Code:

    VB.NET-Quellcode

    1. Public Function MakeScreenshot() As Bitmap
    2. Dim screenBounds = Screen.PrimaryScreen.Bounds
    3. Dim bmp As New Bitmap(screenBounds.Width, screenBounds.Height)
    4. Graphics.FromImage(bmp).CopyFromScreen(screenBounds.Location, New Point(0, 0), screenBounds.Size)
    5. Return bmp
    6. End Function

    Artentus schrieb:

    Mit meiner Methode brauche ich nur 4 Zeilen Code:

    VB.NET-Quellcode

    1. Public Function MakeScreenshot() As Bitmap
    2. Dim screenBounds = Screen.PrimaryScreen.Bounds
    3. Dim bmp As New Bitmap(screenBounds.Width, screenBounds.Height)
    4. Graphics.FromImage(bmp).CopyFromScreen(screenBounds.Location, New Point(0, 0), screenBounds.Size)
    5. Return bmp
    6. End Function


    Jetzt schon.
    Fehler ist aber immernoch da

    Hier mal der ganze Code:

    VB.NET-Quellcode

    1. Imports System.Drawing, System.Windows.Forms
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. MakeScreenshot()
    5. End Sub
    6. Public Function MakeScreenshot() As Bitmap
    7. Dim screenBounds = Screen.PrimaryScreen.Bounds
    8. Dim bmp As New Bitmap(screenBounds.Width, screenBounds.Height)
    9. Graphics.FromImage(bmp).CopyFromScreen(screenBounds.Location, New Point(0, 0), screenBounds.Size)
    10. Return bmp
    11. End Function
    12. End Class
    Dann bin ich mit meinem Latein ehrlich gesagt am Ende. Ich hab das 1 zu 1 aus der IDE rauskopiert, und dort hat es 100% geklappt. :S

    Edit: eine Möglichkeit gibts noch. hast du irgendwo eine Variable mit dem Namen "Screen" deklariert? Gib es notfalls mal vollqualifiziert an.
    Das gab's hier schonmal. Nur umfangreicher gelöst und abgesichert gegen den Fall, dass das Fenster nicht aktiv/im Vordergrund ist: [VB.NET] Screenshot via Programmhandler

    Die Frage ist nur was du glaubst, wo die Bitmap in Zeile 6 deines Codes landet?!
    Was ich nicht verstehe ist folgendes:
    Wenn ich die "Drucken" Taste drücke und in Paint STRG+V mache, fügt er den kompletten Bildschirm ein.
    Mach ich aber folgendes:

    VB.NET-Quellcode

    1. SendKeys.Send("{PRTSC}")
    2. Dim meinbild As Image = Clipboard.GetImage
    3. PictureBox1.Image = meinbild


    Haut er mir nur ein Screen des Programms raus. :huh:
    Naja wie auch immer habe nun ne Klasse gefunden die einwandfrei funktioniert.
    Danke trotzdem.


    VB.NET-Quellcode

    1. Public Class Screenshot
    2. Public Shared Function TakeScreenshot(ByVal SavePath As String, ByVal Width As Integer, ByVal height As Integer, Optional ByVal DestinationX As Integer = 0, Optional ByVal DestinationY As Integer = 0)
    3. Dim bounds As Rectangle
    4. Dim screenshot As System.Drawing.Bitmap
    5. Dim graph As Graphics
    6. bounds = Screen.PrimaryScreen.Bounds
    7. screenshot = New System.Drawing.Bitmap(Width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    8. graph = Graphics.FromImage(screenshot)
    9. graph.CopyFromScreen(DestinationX, DestinationY, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
    10. screenshot.Save(SavePath)
    11. Return screenshot
    12. End Function
    13. End Class
    Also ich hab es gerade mal getestet mit

    VB.NET-Quellcode

    1. Imports System.Drawing, System.Windows.Forms
    2. Public Class Form1
    3. Public Function MakeScreenshot() As Bitmap
    4. Dim screenBounds = Screen.PrimaryScreen.Bounds
    5. Dim bmp As New Bitmap(screenBounds.Width, screenBounds.Height)
    6. Graphics.FromImage(bmp).CopyFromScreen(screenBounds.Location, New Point(0, 0), screenBounds.Size)
    7. Return bmp
    8. End Function
    9. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. PictureBox1.Image = MakeScreenshot()
    11. End Sub
    12. End Class


    Da wird ganz normal der
    Screenshot erstellt und in die Picturebox geladen, kein gemecker (Screen von 0,0 bis max grösse Picturebox.)
    Achja, ich hab net framework 3.5

    Muss also bei Dir liegen, wenns ein Fehler ist...
    Ich benutze aber 2008, ich traue der 2010 express nicht, fall Du die hast
    EDIT: gerade gesehen 2012.. vieleicht is da auch so was seltsames ^^
    @Artentus
    Der einzigste Fehler, welcher mir aufgefallen ist, ist der, dass du bounds keinen Typ zuweist, dieser müsste doch Rectangle sein, oder? Ansonsten ist alles richtig, der zweite Fehler resultiert aus dem ersten Fehler, da hat der TE wohl irgendeine Klasse oä mit dem Namen Screen...