2013-08-21 8 views
5

Ich habe ein WebBrowser-Steuerelement in WinForms, dessen URL-Eigenschaft auf eine externe Webseite festgelegt ist. Ich habe auch einen Event-Handler für das DocumentCompleted-Ereignis. Innerhalb dieses Handlers versuche ich, spezifische Elemente zu erhalten, aber wb.Document.Body scheint den HTML-Code zu erfassen, bevor onload ausgeführt wird.HTML-Body-Inhalt in WinForms WebBrowser abrufen, nachdem das Body-Onload-Ereignis ausgeführt wurde

{System.Windows.Forms.HtmlElement} 
    All: {System.Windows.Forms.HtmlElementCollection} 
    CanHaveChildren: true 
    Children: {System.Windows.Forms.HtmlElementCollection} 
    ClientRectangle: {X = 0 Y = 0 Width = 1200 Height = 0} 
    Document: {System.Windows.Forms.HtmlDocument} 
    DomElement: {mshtml.HTMLBodyClass} 
    ElementShim: {System.Windows.Forms.HtmlElement.HtmlElementShim} 
    Enabled: true 
    FirstChild: null 
    htmlElement: {mshtml.HTMLBodyClass} 
    Id: null 
    InnerHtml: "\n" 
    InnerText: null 
    Name: "" 
    NativeHtmlElement: {mshtml.HTMLBodyClass} 
    NextSibling: null 
    OffsetParent: null 
    OffsetRectangle: {X = 0 Y = 0 Width = 1200 Height = 0} 
    OuterHtml: "<body onload=\"evt_Login_onload(event);\" uitheme=\"Web\">\n</body>" 
    OuterText: null 
    Parent: {System.Windows.Forms.HtmlElement} 
    ScrollLeft: 0 
    ScrollRectangle: {X = 0 Y = 0 Width = 1200 Height = 0} 
    ScrollTop: 0 
    shimManager: {System.Windows.Forms.HtmlShimManager} 
    ShimManager: {System.Windows.Forms.HtmlShimManager} 
    Style: null 
    TabIndex: 0 
    TagName: "BODY" 

"<body onload=\"evt_Login_onload(event);\" uitheme=\"Web\">\n</body>" ist der Pre-JavaScript-Inhalt. Gibt es eine Möglichkeit, den Status des Body-Tags zu erfassen, nachdem evt_Login_onload(event); ausgeführt wird?

Ich habe auch versucht mit wb.Document.GetElementById("id"), aber es gibt null zurück.

Antwort

6

Hier ist, wie es getan werden kann, habe ich setzen einige Kommentare inline:

private void Form1_Load(object sender, EventArgs e) 
{ 
    bool complete = false; 
    this.webBrowser1.DocumentCompleted += delegate 
    { 
     if (complete) 
      return; 
     complete = true; 
     // DocumentCompleted is fired before window.onload and body.onload 
     this.webBrowser1.Document.Window.AttachEventHandler("onload", delegate 
     { 
      // Defer this to make sure all possible onload event handlers got fired 
      System.Threading.SynchronizationContext.Current.Post(delegate 
      { 
       // try webBrowser1.Document.GetElementById("id") here 
       MessageBox.Show("window.onload was fired, can access DOM!"); 
      }, null); 
     }); 
    }; 

    this.webBrowser1.Navigate("http://www.example.com"); 
} 
+1

+1 ich diese Antwort bestätigen kann für mich gearbeitet, obwohl ich keine Notwendigkeit der Verwendung von 'SyncronizationContext.Current.Post hatte() 'weil ich single-threaded läuft. –

+0

@StevendeSalas, sollte der gesamte Zweck von 'SyncronizationContext.Current.Post' aus dem 'onload'-Event-Handler zurückkehren und asynchron im selben UI-Thread weiterlaufen (so würden mögliche Ausnahmen nicht innerhalb des MSHTML-Codes ausgelöst, der das Event auslöst)). Der Code hat sich seither etwas weiterentwickelt, um stattdessen 'async' /' erwarten' zu verwenden, [Beispiel] (http://stackoverflow.com/a/19063643/1768303). – Noseratio

+0

Ich versuchte einen ähnlichen Ansatz - aber nicht funktioniert .. Können Sie einen Blick http://stackoverflow.com/questions/22697987/form-become-blank-intermittierend werfen? – Lijo

Verwandte Themen