Screenshot erstellt, Zugriff der Datei danach nicht möglich

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Bibi.

    Screenshot erstellt, Zugriff der Datei danach nicht möglich

    Guten Tag,

    ich habe momentan folgendes Problem.
    Ich erstelle ein Screenshot mit folgendem Code.

    VB.NET-Quellcode

    1. Public Function Screenshot() As Bitmap
    2. Dim b As New Bitmap(w, h)
    3. Try
    4. gGraficPath = bx.Path.Temp + "screenshot_" + Now.Year.ToString + "." + Now.Month.ToString + "." + Now.Day.ToString + " " + Now.Ticks.ToString + ".png"
    5. gGrafik = Graphics.FromImage(b)
    6. 'Dim g As Graphics = Graphics.FromImage(b)
    7. 'g.CopyFromScreen(x0, y0, 0, 0, New Size(w, h))
    8. gGrafik.CopyFromScreen(x0, y0, 0, 0, New Size(w, h))
    9. b.Save(gGraficPath, System.Drawing.Imaging.ImageFormat.Png)
    10. 'g.Dispose()
    11. gReturn = True
    12. b.Dispose()
    13. gGrafik.Dispose()
    14. Catch ex As Exception
    15. Debug_Error(Me.GetType().FullName, System.Reflection.MethodBase.GetCurrentMethod().Name, ex.Message, bx.Settings.iDebugMessage)
    16. End Try
    17. Return b
    18. End Function


    Jetzt möchte ich zu einem folgenden Zeitpunkt wie folgt darauf zugreifen...

    VB.NET-Quellcode

    1. Dim img As Image
    2. Dim objFileStream As New FileStream(gGraficPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
    3. img = System.Drawing.Image.FromStream(objFileStream)
    4. 'img = Image.FromFile(gGraficPath)
    5. img.Save(gFFPath, System.Drawing.Imaging.ImageFormat.Png)
    6. img.Dispose()
    7. img = Nothing
    8. objFileStream.Close()
    9. objFileStream.Dispose()
    10. objFileStream = Nothing


    ... und bekomme folgende Fehlermeldung.
    Der Prozess kann nicht auf die Datei "C:\ordner\screenshot_2012.12.17 634913478715141159.png" zugreifen, da sie von einem anderen Prozess verwendet wird.


    Der Fehler erscheint an genau dieser Stelle...

    VB.NET-Quellcode

    1. Dim objFileStream As New FileStream(gGraficPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)


    Eigentlich bin ich davon ausgegangen das es sich mit "gGrafik.Dispose()" getan hätte und der Prozess daher nicht mehr das Besitzrecht auf die Datei hat. Dem scheint aber nicht so zu sein und ich bin mir gerade unschlüssig woran es liegt bzw. finde den Fehler nicht. Vermutlich ist es aber recht simpel.

    Ich würde mich über Hilfe sehr freuen.
    Danke :)
    Die Datei ist bereits gespeichert.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim b As Bitmap = Screenshot()
    3. End Sub
    genügt völlig.
    Wo hast Du denn die ganzen Variablen deklariert?
    Hast Du etwa nocht Option Strict On :?:
    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!
    Hallo,
    ich danke für eure Antworten.

    ErfinderDesRades schrieb:


    Ich glaube ich verstehe nicht wie ich das auf mein Beispiel anwenden soll.
    Habe da einiges in der "Screenshot" Routine angepasst aber irgendwie hat nichts davon funktioniert.
    Ich habe es wie folgt ausprobiert...

    VB.NET-Quellcode

    1. Public Function Screenshot() As Bitmap
    2. Dim b As Bitmap
    3. Dim gGrafik As Graphics
    4. gGraficPath = bx.Path.Temp + "screenshot_" + Now.Year.ToString + "." + Now.Month.ToString + "." + Now.Day.ToString + " " + Now.Ticks.ToString + ".png"
    5. Using Bmp As New Bitmap(gGraficPath)
    6. b = New Bitmap(Bmp)
    7. End Using
    8. Try
    9. gGrafik = Graphics.FromImage(b)
    10. gGrafik.CopyFromScreen(x0, y0, 0, 0, New Size(w, h))
    11. b.Save(gGraficPath, System.Drawing.Imaging.ImageFormat.Png)
    12. gReturn = True
    13. b.Dispose()
    14. b = Nothing
    15. gGrafik.Dispose()
    16. gGrafik = Nothing
    17. Catch ex As Exception
    18. Debug_Error(Me.GetType().FullName, System.Reflection.MethodBase.GetCurrentMethod().Name, ex.Message, bx.Settings.iDebugMessage)
    19. End Try
    20. Return b
    21. End Function



    RodFromGermany schrieb:

    Die Datei ist bereits gespeichert.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim b As Bitmap = Screenshot()
    3. End Sub
    genügt völlig.

    Ich nutze doch an später Stelle erst die "erstellte" Grafik anhand des Pfades.
    Nur wenn ich diese über den Filestream lesen möchte erscheint ja die Fehlermeldung, weiß daher gerade mit diesem Rat nichts anzufangen.


    RodFromGermany schrieb:


    Wo hast Du denn die ganzen Variablen deklariert?
    Hast Du etwa nocht Option Strict On :?:

    Teils global.
    Option Strict auf "On"

    Bibi schrieb:

    Teils global.
    Das ist nicht gut.
    Mach es mal so oder so ähnlich:

    VB.NET-Quellcode

    1. Private w As Integer = 600
    2. Private h As Integer = 400
    3. Public Sub Screenshot()
    4. Dim x0 = 0
    5. Dim y0 = 0
    6. Using b As New Bitmap(w, h)
    7. Dim gGraficPath = "c:\Temp\screenshot_" + Now.Year.ToString + "." + Now.Month.ToString + "." + Now.Day.ToString + " " + Now.Ticks.ToString + ".png"
    8. Dim gGrafik = Graphics.FromImage(b)
    9. gGrafik.CopyFromScreen(x0, y0, 0, 0, New Size(w, h))
    10. b.Save(gGraficPath, System.Drawing.Imaging.ImageFormat.Png)
    11. gGrafik.Dispose()
    12. End Using
    13. End Sub
    Ich hab alles rausgeschmissen, was nicht erforderlich ist.
    Insbesondere die zurückgegebene Bitmap, die war nämlich disposed.
    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!
    Hallo,

    danke dir für die Antwort.
    Das habe ich so umgesetzt, jedoch weiterhin das Problem.
    Was mir gerade auffällt...
    Bevor ich die Datei weiter verwendet und nachdem ich den Screenshot erstelle, zeige ich dieses Bild (vom Pfad) in einer Picturebox an.

    VB.NET-Quellcode

    1. pbPreview.Image = Image.FromFile(screen.gGraficPath)


    Könnte das Grund für die Sperrung sein?

    Bibi schrieb:

    Könnte das Grund für die Sperrung sein?
    Positiv.
    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!

    ErfinderDesRades schrieb:

    Bibi schrieb:

    pbPreview.Image = nothing
    bitte gewöhn dir an, IDisposable Resourcen richtig mit .Dispose freizugeben. Die GarbageCollection ist bei diesen Resourcen nicht zuverlässig.

    Werde ich machen, danke.
    Hatte ich vorher, nur habe ich "pbPreview.dispose" ausgeführt und nicht bemerkt das ich das ".image" vergessen habe.

    Edit: Irgendwie mache ich gerade nur Bockmist. pbPreview.image.dispose funktioniert auch nicht