2016-06-28 17 views
0

Ich habe ein Programm (Derzeit winform), die eine Website lädt, macht einen Screenshot und konvertiert in Bitmap und speichert dann. Das Problem, auf das ich stoße, ist, dass Daten nicht auf die Website geladen werden können. Warum ich denke, dass es das ist, es dauert den Screenshot zu schnell und hat keine Zeit, um vollständig geladen zu werden.Hinzufügen von Verzögerung zu Website-Screenshot

Beispiel: Unter der 'Statistik' sollte eine Reihe von Informationen erscheinen, die noch nicht geladen zu sein scheint.

Example

Ich habe versucht, ein Threading.sleep an einigen Stellen setzen, aber es ist nicht das Ergebnis ändern.

-Code

Private Sub btnDrawBmp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Capture.Click 
    ' Initialize new Hidden Browser control and navigate to site 
    Dim Browser As New WebBrowser 
    Browser.ScrollBarsEnabled = False 
    Browser.Navigate("http://xxxxx/LiveStats/") 
    ' Initialize Handler for DocumentCompleted event and wait for that event to fire 
    AddHandler Browser.DocumentCompleted, AddressOf Browser_DocumentCompleted 
    While Browser.ReadyState <> WebBrowserReadyState.Complete 
     Application.DoEvents() 
    End While 
    ' Housekeeping 
    Browser.Dispose() 
End Sub 
Private Sub Browser_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) 
    ' If sender was a WebBrowser then initialize a reference to it otherwise throw an exception 
    Dim Browser As WebBrowser = DirectCast(sender, WebBrowser) 
    ' Set browser start size, determine scrollheight, resize browser to match scrollheight 
    Browser.ClientSize = New Size(1024, 768) 
    Dim Height As Integer = Browser.Document.Body.ScrollRectangle.Bottom 
    Browser.ClientSize = New Size(1024, Height) 
    ' Initialize bitmap to match width & scrollheight for fullsize screen capture 
    Dim Bmp = New Bitmap(Browser.Bounds.Width, Height) 
    ' Capture fullsize screen shot 
    Browser.DrawToBitmap(Bmp, Browser.Bounds) 
    Bmp.Save("c:\temp1.png") 
    ' Resize Browser for thumbnail capture 
    Browser.ClientSize = New Size(1024, 768) 
    ' Inialize a new bitmap with the same client area size as the browser 
    Dim Bmp2 = New Bitmap(Browser.Bounds.Width, Browser.Bounds.Height) 
    ' Perform screen capture, convert it to a thumbnail, and save 
    Browser.DrawToBitmap(Bmp2, Browser.Bounds) 
    Bmp2 = Bmp2.GetThumbnailImage(160, 120, Nothing, IntPtr.Zero) 
    Bmp2.Save("c:\temp2.png") 
    ' Housekeeping 
    Bmp.Dispose() 
    Bmp2.Dispose() 
End Sub 

Aktualisiert Code, der immer noch mit Problemen sind:

Hinweis: Nur zwei Objekte auf dem Formular eine Schaltfläche und ein Browser.

Private Sub btnDrawBmp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Capture.Click 
    ' Initialize new Hidden Browser control and navigate to site 
    'Dim Browser As New WebBrowser 
    Dim Browser = wb 
    Browser.ScrollBarsEnabled = False 
    Browser.Navigate("http://ssgw8sr01/LiveStats/") 
    'Browser.Navigate("http://google.com") 
    ' Initialize Handler for DocumentCompleted event and wait for that event to fire 
    AddHandler Browser.DocumentCompleted, AddressOf Browser_DocumentCompleted 
    While Browser.ReadyState <> WebBrowserReadyState.Complete 
     Application.DoEvents() 
    End While 
    ' Housekeeping 
    Browser.Dispose() 
End Sub 
Private Sub Browser_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) 
    If (e.Url = wb.Url) AndAlso (wb.ReadyState = WebBrowserReadyState.Complete) Then 
     ' If sender was a WebBrowser then initialize a reference to it otherwise throw an exception 
     Dim Browser As WebBrowser = DirectCast(sender, WebBrowser) 
     ' Set browser start size, determine scrollheight, resize browser to match scrollheight 
     Browser.ClientSize = New Size(1024, 768) 
     Dim Height As Integer = Browser.Document.Body.ScrollRectangle.Bottom 
     Browser.ClientSize = New Size(1024, Height) 
     ' Initialize bitmap to match width & scrollheight for fullsize screen capture 
     Dim Bmp = New Bitmap(Browser.Bounds.Width, Height) 
     ' Capture fullsize screen shot 
     Browser.DrawToBitmap(Bmp, Browser.Bounds) 
     Bmp.Save("c:\temp1.png") 
     ' Resize Browser for thumbnail capture 
     Browser.ClientSize = New Size(1024, 768) 
     ' Inialize a new bitmap with the same client area size as the browser 
     Dim Bmp2 = New Bitmap(Browser.Bounds.Width, Browser.Bounds.Height) 
     ' Perform screen capture, convert it to a thumbnail, and save 
     Browser.DrawToBitmap(Bmp2, Browser.Bounds) 
     Bmp2 = Bmp2.GetThumbnailImage(160, 120, Nothing, IntPtr.Zero) 
     Bmp2.Save("c:\temp2.png") 
     ' Housekeeping 
     Bmp.Dispose() 
     Bmp2.Dispose() 
    End If 

End Sub 
+1

Sie sollten wahrscheinlich eine Asynchron-Version von Seite Loader verwenden, die Sie benachrichtigt, wenn der Ladevorgang abgeschlossen ist, so dass Sie in diesen Fragen nicht – VSG24

+0

laufen @ VSG24 nicht sicher, was „async“ ist. Versucht zu googeln es gebunden an meine Frage und fand nicht viel – dwb

+0

Suche nur nach "VB.Net asynchrone Programmierung" – VSG24

Antwort

2

Fügen Sie dies in Ihrem doc_completed Ereignis hinzu, ändern Sie die WB Variablen, ich bin auf meinem Telefon und es ist ein PITA.

Ich denke, Sie müssen auf den Bereitschaftszustand warten, um vollständig zu erreichen.

If (e.Url = wb.Url) AndAlso (wb.ReadyState = WebBrowserReadyState.Complete) Then 
' If sender was a WebBrowser then initialize a reference to it otherwise throw an exception 
    Dim Browser As WebBrowser = DirectCast(sender, WebBrowser) 
    ' Set browser start size, determine scrollheight, resize browser to match scrollheight 
    Browser.ClientSize = New Size(1024, 768) 
    Dim Height As Integer = Browser.Document.Body.ScrollRectangle.Bottom 
    Browser.ClientSize = New Size(1024, Height) 
    ' Initialize bitmap to match width & scrollheight for fullsize screen capture 
    Dim Bmp = New Bitmap(Browser.Bounds.Width, Height) 
    ' Capture fullsize screen shot 
    Browser.DrawToBitmap(Bmp, Browser.Bounds) 
    Bmp.Save("c:\temp1.png") 
    ' Resize Browser for thumbnail capture 
    Browser.ClientSize = New Size(1024, 768) 
    ' Inialize a new bitmap with the same client area size as the browser 
    Dim Bmp2 = New Bitmap(Browser.Bounds.Width, Browser.Bounds.Height) 
    ' Perform screen capture, convert it to a thumbnail, and save 
    Browser.DrawToBitmap(Bmp2, Browser.Bounds) 
    Bmp2 = Bmp2.GetThumbnailImage(160, 120, Nothing, IntPtr.Zero) 
    Bmp2.Save("c:\temp2.png") 
    ' Housekeeping 
    Bmp.Dispose() 
    Bmp2.Dispose() 
End If 

EDIT:

Dieses getestet wurde, und wirkt wie ein Zauber ... sogar auf langsamen Ladestellen. Es wird den Screenshot erst erstellen, wenn das Laden fertig ist.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     WebBrowser1.Navigate("http:\\www.msn.com") 
    End Sub 

    Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted 
     If (e.Url = WebBrowser1.Url) AndAlso (WebBrowser1.ReadyState = WebBrowserReadyState.Complete) Then 
      getBitmap(WebBrowser1).Save("C:\Users\Anthony Wiles\Desktop\myScreenShot.png") 
     End If 
    End Sub 

    Private Function getBitmap(ByVal pCtrl As Control) As Drawing.Bitmap 
     Dim myBmp As New Bitmap(pCtrl.Width, pCtrl.Height) 
     Dim g As Graphics = Graphics.FromImage(myBmp) 
     Dim pt As Point = pCtrl.Parent.PointToScreen(pCtrl.Location) 
     g.CopyFromScreen(pt, Point.Empty, myBmp.Size) 
     g.Dispose() 
     Return myBmp 
    End Function 
+0

Danke für die Antwort. Ich habe meinen Code aktualisiert, um zu passen, und an dieser Stelle wird nicht einmal ein Screenshot gespeichert. Irgendwelche Ideen warum? Hinweis: Ich habe auch die URL in Google geändert, um nur mit den gleichen Ergebnissen zu testen. – dwb

+0

Wird das Ereignis ausgelöst? – TonyW

+0

Es wurde der 'if' Befehl übersprungen. Ich änderte von 'Dim Browser As New WebBrowser' zu 'Dim Browser = wb'. Es liefert immer noch die gleichen Ergebnisse des Screenshots ohne die Informationen. Außerdem habe ich den Top-Code mit dem aktuellen Stand aktualisiert. – dwb

Verwandte Themen