Steuerelemente werden bei Screenshot Überdeckt

  • VB.NET
  • .NET (FX) 4.0

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Steuerelemente werden bei Screenshot Überdeckt

    Guten Tag liebe Community, ich habe mir mal ein Script zum erstellen eines Screenshots des Formulars aus dem Netz in meinen Code eingebunden. Es stammt vermutlich von dem Forum hier, bin mir aber nicht mehr sicher. Auf jeden Fall besteht folgende Problematik: Wenn ich ein Bild von der Form mache, dann ist in dem Screenshot die picturebox (wird dynamisch in einem array erstellt) unter das label gepackt, sodass man das bild nicht mehr sieht weil das label mit dem text drüber ist!
    Ich hoffe ihr könnt mir dabei helfen dieses Problem zu lösen
    Hier der Code zum machen des screenshots:

    Visual Basic-Quellcode

    1. <span data-bbcode="vb" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frm_main.cmd_quit.Hide()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frm_main.cmd_settings.Hide()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frm_main.cmd_minimize.Hide()<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dim Steuerelement As Control<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ' ***** Welches Steuerelement, ggf anpassen (z.B. Button1) *****<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Steuerelement = frm_main &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;' Me entspricht Form<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dim Breite As Integer = Steuerelement.Width &nbsp; &nbsp; &nbsp; &nbsp; ' Breite des Steuerelements<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dim Hoehe As Integer = Steuerelement.Height &nbsp; &nbsp; &nbsp; &nbsp; ' Höhe des Steuerelements<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dim Schnappschuss As Bitmap = New Bitmap(Breite, Hoehe) ' Größe der Bitmap<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ' ***** Schnappschuß machen als Bipmap *****<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Steuerelement.DrawToBitmap(Schnappschuss, Rectangle.FromLTRB(0, 0, Breite, Hoehe))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; My.Computer.Clipboard.SetImage(Schnappschuss) &nbsp; &nbsp; &nbsp; ' In die Zwischenablage<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ' ***** Falls in der Zwischenablage eine Bitmap vorliegt *****<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If System.Windows.Forms.Clipboard.GetDataObject() IsNot Nothing Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dim Zwischenablage As IDataObject = System.Windows.Forms.Clipboard.GetDataObject()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If Zwischenablage.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap) Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; If sfd_main.ShowDialog(Me) = DialogResult.OK Then<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dim sSavePath As String = sfd_main.FileName<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dim Bitmuster As System.Drawing.Image = CType(Zwischenablage.GetData(DataFormats.Bitmap, True), Image)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Bitmuster.Save(sSavePath)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Diagnostics.Process.Start(sSavePath)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frm_main.cmd_quit.Show()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frm_main.cmd_settings.Show()<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frm_main.cmd_minimize.Show()</span>


    Ich krieg das mit dem anzeigen des codes hier scheinbar nicht hin^^ hier mal auf pastebin: pastebin.com/sZmmTkpa

    vielen Dank
    Keine Ahnung warum es derart verrückt gespielt hat bei dir, aber das richtige Code-Tag sollte man schon wählen, Visual Basic ist für VB6. Du willst aber scheinbar VB.NET.

    VB.NET-Quellcode

    1. Try
    2. frm_main.cmd_quit.Hide()
    3. frm_main.cmd_settings.Hide()
    4. frm_main.cmd_minimize.Hide()
    5. Dim Steuerelement As Control
    6. ' ***** Welches Steuerelement, ggf anpassen (z.B. Button1) *****
    7. Steuerelement = frm_main ' Me entspricht Form
    8. Dim Breite As Integer = Steuerelement.Width ' Breite des Steuerelements
    9. Dim Hoehe As Integer = Steuerelement.Height ' Höhe des Steuerelements
    10. Dim Schnappschuss As Bitmap = New Bitmap(Breite, Hoehe) ' Größe der Bitmap
    11. ' ***** Schnappschuß machen als Bipmap *****
    12. Steuerelement.DrawToBitmap(Schnappschuss, Rectangle.FromLTRB(0, 0, Breite, Hoehe))
    13. My.Computer.Clipboard.SetImage(Schnappschuss) ' In die Zwischenablage
    14. ' ***** Falls in der Zwischenablage eine Bitmap vorliegt *****
    15. If System.Windows.Forms.Clipboard.GetDataObject() IsNot Nothing Then
    16. Dim Zwischenablage As IDataObject = System.Windows.Forms.Clipboard.GetDataObject()
    17. If Zwischenablage.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap) Then
    18. If sfd_main.ShowDialog(Me) = DialogResult.OK Then
    19. Dim sSavePath As String = sfd_main.FileName
    20. Dim Bitmuster As System.Drawing.Image = CType(Zwischenablage.GetData(DataFormats.Bitmap, True), Image)
    21. Bitmuster.Save(sSavePath)
    22. System.Diagnostics.Process.Start(sSavePath)
    23. End If
    24. End If
    25. End If
    26. frm_main.cmd_quit.Show()
    27. frm_main.cmd_settings.Show()
    28. frm_main.cmd_minimize.Show()
    29. Catch ex As Exception
    30. MsgBox("Fehler", MsgBoxStyle.Critical, "Fehler")
    31. End Try

    Mücahit schrieb:

    unter das label gepackt
    Jou, so ist es.
    Ein ScreenShot holt sich, wie der Name schon sagt, die Pixel vom Screen, nicht aber aus dem Paint-Event Deiner Form.
    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!
    Hi, ich habe vergessen zu erwähnen, dass es auch nichts bringt wenn ich die labels in den hintergrund packe. falls uns das weiter bringt...

    Gibt es denn eine Möglichkeit das so zu fotografieren, dass es so aussieht wie in der aktuellen form?

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Mücahit schrieb:

    so aussieht
    Poste mal einen Screenshot und markiere das.
    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!
    @Mücahit Control anklicken und dann dies:

    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!

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class frm_main
    3. Inherits System.Windows.Forms.Form
    4. 'Form overrides dispose to clean up the component list.
    5. <System.Diagnostics.DebuggerNonUserCode()> _
    6. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    7. Try
    8. If disposing AndAlso components IsNot Nothing Then
    9. components.Dispose()
    10. End If
    11. Finally
    12. MyBase.Dispose(disposing)
    13. End Try
    14. End Sub
    15. 'Required by the Windows Form Designer
    16. Private components As System.ComponentModel.IContainer
    17. 'NOTE: The following procedure is required by the Windows Form Designer
    18. 'It can be modified using the Windows Form Designer.
    19. 'Do not modify it using the code editor.
    20. <System.Diagnostics.DebuggerStepThrough()> _
    21. Private Sub InitializeComponent()
    22. Me.Button1 = New System.Windows.Forms.Button()
    23. Me.Label1 = New System.Windows.Forms.Label()
    24. Me.PictureBox1 = New System.Windows.Forms.PictureBox()
    25. Me.sfd_main = New System.Windows.Forms.SaveFileDialog()
    26. CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).BeginInit()
    27. Me.SuspendLayout()
    28. '
    29. 'Button1
    30. '
    31. Me.Button1.Location = New System.Drawing.Point(513, 387)
    32. Me.Button1.Name = "Button1"
    33. Me.Button1.Size = New System.Drawing.Size(75, 23)
    34. Me.Button1.TabIndex = 0
    35. Me.Button1.Text = "Button1"
    36. Me.Button1.UseVisualStyleBackColor = True
    37. '
    38. 'Label1
    39. '
    40. Me.Label1.AutoSize = True
    41. Me.Label1.Location = New System.Drawing.Point(240, 153)
    42. Me.Label1.Name = "Label1"
    43. Me.Label1.Size = New System.Drawing.Size(86, 13)
    44. Me.Label1.TabIndex = 1
    45. Me.Label1.Text = "dsfdsfgdfgdfgdfg"
    46. '
    47. 'PictureBox1
    48. '
    49. Me.PictureBox1.Image = Global.screenshot_test.My.Resources.Resources._20151125102243
    50. Me.PictureBox1.Location = New System.Drawing.Point(187, 71)
    51. Me.PictureBox1.Name = "PictureBox1"
    52. Me.PictureBox1.Size = New System.Drawing.Size(306, 210)
    53. Me.PictureBox1.TabIndex = 2
    54. Me.PictureBox1.TabStop = False
    55. '
    56. 'Form1
    57. '
    58. Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    59. Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    60. Me.ClientSize = New System.Drawing.Size(753, 487)
    61. Me.Controls.Add(Me.Label1)
    62. Me.Controls.Add(Me.Button1)
    63. Me.Controls.Add(Me.PictureBox1)
    64. Me.Name = "Form1"
    65. Me.Text = "Form1"
    66. CType(Me.PictureBox1, System.ComponentModel.ISupportInitialize).EndInit()
    67. Me.ResumeLayout(False)
    68. Me.PerformLayout()
    69. End Sub
    70. Friend WithEvents Button1 As System.Windows.Forms.Button
    71. Friend WithEvents Label1 As System.Windows.Forms.Label
    72. Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
    73. Friend WithEvents sfd_main As System.Windows.Forms.SaveFileDialog
    74. End Class


    Zitat entfernt Code richtig formatiert (scheinbar hatte der PostHandler wieder seine fünf Minuten). ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    @Mücahit Bei mir kann ich das alles mit &quot;In den Vordergrund / Hintergrund&quot; machen.
    Wie befüllst Du das Label?
    Nimm ne TextBox.
    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!

    Mücahit schrieb:

    wie meinst du
    Im geposteten Code sind da ca. 10 Zeichen drin, auf dem Screenshot ca. 1000.
    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!

    RodFromGermany schrieb:

    Wie befüllst Du das Label?

    Mücahit schrieb:

    während der laufzeit
    Fein. Das hatte ich mir bereits gedacht. :rolleyes:
    Poste mal die Code-Umgebung davon.
    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!

    VB.NET-Quellcode

    1. ​Public Class frm_main
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Try
    4. Dim Steuerelement As Control
    5. ' ***** Welches Steuerelement, ggf anpassen (z.B. Button1) *****
    6. Steuerelement = Me ' Me entspricht Form
    7. Dim Breite As Integer = Steuerelement.Width ' Breite des Steuerelements
    8. Dim Hoehe As Integer = Steuerelement.Height ' Höhe des Steuerelements
    9. Dim Schnappschuss As Bitmap = New Bitmap(Breite, Hoehe) ' Größe der Bitmap
    10. ' ***** Schnappschuß machen als Bipmap *****
    11. Steuerelement.DrawToBitmap(Schnappschuss, Rectangle.FromLTRB(0, 0, Breite, Hoehe))
    12. My.Computer.Clipboard.SetImage(Schnappschuss) ' In die Zwischenablage
    13. ' ***** Falls in der Zwischenablage eine Bitmap vorliegt *****
    14. If System.Windows.Forms.Clipboard.GetDataObject() IsNot Nothing Then
    15. Dim Zwischenablage As IDataObject = System.Windows.Forms.Clipboard.GetDataObject()
    16. If Zwischenablage.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap) Then
    17. If sfd_main.ShowDialog(Me) = DialogResult.OK Then
    18. Dim sSavePath As String = sfd_main.FileName
    19. Dim Bitmuster As System.Drawing.Image = CType(Zwischenablage.GetData(DataFormats.Bitmap, True), Image)
    20. Bitmuster.Save(sSavePath)
    21. System.Diagnostics.Process.Start(sSavePath)
    22. End If
    23. End If
    24. End If
    25. 'Screenshot(frm_main)
    26. Catch ex As Exception
    27. End Try
    28. End Sub
    29. End Class


    Code von Pastebin hier eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Mücahit schrieb:

    das ist alles
    Ich konnte Deinen Effekt reproduzieren:

    MSDN
    Interessant ist die Lektüre der MSDN:
    Hinweise
    Die DrawToBitmap-Methode wird nicht für ActiveX-Steuerelemente unterstützt. Sie können das OnPrint-Ereignis überschreiben und benutzerdefinierte Drucklogik nach Bedarf bereitstellen.
    Die DrawToBitmap-Methode weist die folgenden Einschränkungen auf.
    • Bei großen Bitmaps wird möglicherweise eine ArgumentException ausgelöst. Die zulässige Höchstgröße hängt vom Computer ab.
      DrawToBitmap unterstützt die Ink-Steuerelemente für das Betriebssystem Windows XP Tablet PC Edition 2005 nicht.
    • DrawToBitmap zeichnet keine untergeordnete TextBox, wenn die Visible-Eigenschaft der TextBox auf false festgelegt ist.
    • Steuerelemente in Containern werden in umgekehrter Reihenfolge gerendert.
    • DrawToBitmap ist für die RichTextBox nicht völlig funktionsfähig. Es wird nur der Rahmen einer Bitmap gezeichnet.
    Abhilfe
    Nimm mal ne andere ScreenShot-Funktion:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim sSavePath As String = "C:\Temp\xxxx.png"
    3. Dim pt = Me.Location
    4. Dim bmp As New Bitmap(Me.Width, Me.Height)
    5. Dim g As Graphics = Graphics.FromImage(bmp)
    6. g.CopyFromScreen(pt.X, pt.Y, 0, 0, Me.Size)
    7. g.Dispose()
    8. bmp.Save(sSavePath, System.Drawing.Imaging.ImageFormat.Png)
    9. bmp.Dispose()
    10. System.Diagnostics.Process.Start(sSavePath)
    11. End Sub

    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!
    Danke für die Antwort! Aber diese Funktion hatte ich bereits genutzt. Das problem dabei ist, dass die form auch die taskleiste auf den screenshot aufnimmt. Vorraussetzung dafür, dass die taskleiste aufgenommen wird ist natürlich dass die form auch "unter" der taskleiste ist. Ich brauche eine Funktion die mir nur das formular als solches abspeichern kann, doch auch nach langer recherche bin ich nicht fündig geworden...

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Mücahit schrieb:

    bereits genutzt
    Beschreibe mal das Gesamtproblem.
    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!