2016-03-21 18 views
1

Ich habe ein Problem hier. Ich habe eine Form1, die ich verwende, um Einstellungen zu erhalten. Aber es gibt auch ein Panel, das ich verwenden möchte, um zu sehen, was in Form2 ist.vb.net Screen Capture von form2 mit form1

Form2 = eine Vollbild-Form ohne formborderstyles

Diese form2 zeigt Informationen auf einem großen Bildschirm und ich brauche in meinem form1 (in diesem Panel), um den gesamten Inhalt form2 wie eine Screencapture Sache zu sehen.

Kann jemand helfen?

Antwort

1

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.

enter image description here

Ein voll funktionierendes Beispiel:

enter image description here

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)) 
' ... 
+0

wird das nicht nach einer Weile mein Gedächtnis überladen? und ist das dasselbe wie ein normaler screenshot oder ist es etwas anderes ?? @elektroStudios –

+0

@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

+0

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