A -Panel wird Flackern Probleme in Windows produzieren, empfehle ich Ihnen einen PictureBox zu platzieren innerhalb des -Panel mit dem PictureBox.Dock = Fill
Objekt (oder benutzen Sie einfach nur die PictureBox anstelle eines -Panel) dann könnten Sie zum Beispiel meine TakeScreenshotFromForm() Funktion von meinem ElektroKit Framework verwenden.
Ein voll funktionierendes Beispiel:
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Public Class Form1 : Inherits Form
Friend WithEvents ScreenshotTimer As New System.Windows.Forms.Timer
Private Sub Test() Handles MyBase.Shown
Form2.Show()
With Me.ScreenshotTimer
.Interval = 100
.Enabled = True
.Start()
End With
Me.PictureBox1.BackgroundImageLayout = ImageLayout.Stretch
End Sub
Private Sub ScreenshotTimer_Tick(sender As Object, e As EventArgs) Handles ScreenshotTimer.Tick
If Me.PictureBox1.BackgroundImage IsNot Nothing Then
Me.PictureBox1.BackgroundImage.Dispose()
End If
Me.PictureBox1.BackgroundImage = TakeScreenshotFromForm(Form2, includeMouse:=True)
End Sub
Public Shared Function TakeScreenshotFromForm(ByVal f As Form,
Optional ByVal includeMouse As Boolean = False,
Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format24bppRgb) As Image
If Not f.Visible Then
Return Nothing
End If
Dim bmp As New Bitmap(f.Size.Width, f.Size.Height, pixelFormat)
Using g As Graphics = Graphics.FromImage(bmp)
g.InterpolationMode = InterpolationMode.Default
g.PixelOffsetMode = PixelOffsetMode.Default
g.CopyFromScreen(f.Location, New Drawing.Point(0, 0), f.Size)
' Draw the cursor in the image.
If includeMouse Then
Dim cursorSize As System.Drawing.Size = CType(f.Cursor.HotSpot, System.Drawing.Size)
cursorSize.Width -= ((f.Size.Width - f.ClientSize.Width) \ 2)
cursorSize.Height -= ((f.Size.Height - f.ClientSize.Height) - ((f.Size.Width - f.ClientSize.Width) \ 2))
Dim formPoint As Drawing.Point = f.PointToClient(Drawing.Point.Subtract(Control.MousePosition, cursorSize))
Cursors.Arrow.Draw(g, New Rectangle(formPoint.X, formPoint.Y, cursorSize.Width, cursorSize.Height))
End If
End Using
Return bmp
End Function
End Class
Anstelle der Methodik, die ich verwenden, können Sie auch die Control.DrawToBitmap() Methode verwenden properlly das Formular zu erfassen, wenn ist nicht sichtbar (auf dem Bildschirm völlig unsichtbar oder von anderen Fenstern abgedeckt), aber das resultierende Bild enthält keine "Informationen" wie z TextBox Caret zum Beispiel.
Dim bmp As New Bitmap(f.Bounds.Size.Width, f.Bounds.Size.Height, pixelFormat)
f.DrawToBitmap(bmp, New Rectangle(0, 0, f.Bounds.Size.Width, f.Bounds.Size.Height))
' ...
wird das nicht nach einer Weile mein Gedächtnis überladen? und ist das dasselbe wie ein normaler screenshot oder ist es etwas anderes ?? @elektroStudios –
@Thomas Dutoit Nein, die Einweg-Objekte werden jedes Mal entsorgt, aber vielleicht könnten Sie merken, wie der Prozess mehr Speicherplatz nach jedem Aufruf reserviert, weil die Art .Net den Speicher verwaltet (trotzdem können Sie eine Speicherbereinigung erzwingen) Zeit, um einen angemesseneren Speicherverbrauchswert zu sehen, da es nicht sehr empfohlen wird, es zu erzwingen). Was meinst du für einen "normalen screenshot"?, Die Methode, die ich gezeigt habe, nimmt ein Bild (Screenshot) der angegebenen Form, ist das nicht, wonach du fragst ?, ich hoffe diese Hilfe !. – ElektroStudios
Die alternative Methode, die unten in meiner Antwort erklärt wird, ist vielleicht eher ein "rohes Bild" als ein Screenshot, weil ich nicht direkt vom Bildschirm kopiere. Wie ich bereits sagte, werden bei dieser Alternative Bildinformationen wie ein Fokusrechteck oder ein Caret, aber auf der anderen Seite ist es hilfreich, ein Formular zu erfassen, wenn es nicht auf dem Bildschirm sichtbar ist. – ElektroStudios