2010-08-18 12 views
7

IAusführen einer JavaScript-Funktion in einer Instanz von Internet Explorer

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer() 

bin mit einer Instanz von Internet Explorer zu steuern/automatisieren. Auf bestimmten Seiten möchte ich eine JavaScript-Funktion ausführen (init()). Es scheint der beste Weg, dies zu tun, ist ein HtmlDocument ‚s InvokeScript Methode zu verwenden, und ich habe kein Glück folgendes versucht:

void ie_DocumentComplete(object pDisp, ref object URL) 
{ 
    System.Windows.Forms.HtmlDocument doc = ie.Document; 
    doc.InvokeScript("init"); 
} 

Welche schlägt fehl, weil doc null ist. Ich kann nicht scheinen System.Windows.Forms.HtmlDocument von ie.Document zu bekommen. Neben den oben genannten Versuch habe ich auch versucht:

System.Windows.Forms.HtmlDocument doc2 = (System.Windows.Forms.HtmlDocument)ie.Document; 

und

System.Windows.Forms.HtmlDocument doc2 = ie.Document as System.Windows.Forms.HtmlDocument; 

Alle Ideen, wie ich diese Arbeit bekommen kann - oder eine noch bessere Möglichkeit, Skripte auf der Seite laufen zu lassen?

Danke !!

EDIT:

Eine weitere Möglichkeit, eine JavaScript-Funktion ausführen zu sein scheint:

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer() 
mshtml.HTMLDocument doc = ie.Document; 
mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2; 
win.execScript("init();", "javascript"); 

Aber die Linie

mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2; 

wirft einen Fehler, dass es eine ungültige Besetzung ist (InvalidCastException) - obwohl IntelliSense (und MSDN) sagen doc.parentWindow ist ein IHTMLWindow2. Irgendwelche Ideen? (Auch habe ich sicher, dass eine Seite vollständig geladen ist, bevor ausgeführt, dass Code)

Antwort

6

Das Problem mit Threading zu tun hatte - ich so viel Zeit mit STA Fragen verschwendet haben Sie denken, würde ich jetzt lernen würde :).

Irgendwie habe ich einen Weg gefunden, um das zweite Bit Code zu bekommen, das ich funktionierte und JavaScript-Funktionen im IE-Fenster laufen ließ! Hier ist der Code:

this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => 
       { 

         mshtml.HTMLDocument doc = ie.Document; 

         mshtml.IHTMLWindow2 win = doc.parentWindow as IHTMLWindow2; 
         win.execScript("init();", "javascript"); 


       })); 

Hoffe es hilft jemand!

+0

Ihre Antwort würde eher helfen, wenn Sie speziell erklären, was Sie getan haben, um das Threading-Problem zu lösen. :-) – EricLaw

0

Die SHDocVw.InternetExplorer.Document ist vom Typ mshtmlHTMLDocumentClass, so müssen Sie Microsoft.mshtml

mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document; 

Das heißt referenzieren Das Objekt muss auch irgendwo navigieren, damit das Dokument einen Wert erhält. wie

object test = new object(); 
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test); 

Insgesamt init:

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer(); 
object test = new object(); 
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test); 
mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document; 
+0

Vielen Dank für Ihre Antwort, aber ich habe Probleme, diese Linie immer zu arbeiten. Es gibt den folgenden Compiler-Fehler: "Interop-Typ 'mshtml.HTMLDocumentClass' kann nicht eingebettet werden. Verwenden Sie stattdessen die entsprechende Schnittstelle." Irgendwelche Ideen? – Evan

+0

(mit dieser Zeile meine ich "mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass) ie.Document;" – Evan

+0

Haben Sie einen Verweis auf Microsoft.mshtml in Ihren Referenzen hinzugefügt? (Nicht das Interop) Es ist unter der Liste von .net Referenzen –

1

Sie müssen auf document.parentWindow in einem STA-Thread zugreifen. Dies kann Ihnen helfen:

private WebBrowser _webBrowser; //initialize this somewhere 

    private void ExecuteJavaScript() 
    { 
    Thread aThread = new Thread(ExecuteJavaScriptWorker); 
    aThread.SetApartmentState(ApartmentState.STA); 
    aThread.Start(); 
    } 

    private void ExecuteJavaScriptWorker() 
    { 
     HTMLDocument _document = _webBrowser.Document; 
     _document.parentWindow.execScript("alert('Arbitrary javascript code')", "javascript"); 
    } 
1

Dies ist ein Beispiel dafür, wie Sie das Dokument einer bestimmten Seite erhalten.Es ist nah an den Beispielen, die oben mit dem kleinen (aber wichtigen) Unterschied gezeigt werden - ich benutze Methode Navigate2 - dieses funktioniert richtig.

public static mshtml.HTMLDocument NavigateTo(String anUrl) { 
    object locEmpty = 0; 
    object locUrl = anUrl; 
    SHDocVw.InternetExplorer _ie = new SHDocVw.InternetExplorer(); 
    _ie.Visible = true; 
    _ie.Navigate2(locUrl, ref locEmpty, ref locEmpty, ref locEmpty, ref locEmpty); 
    return(_ie.Document); 
} 

Dieses Beispiel funktioniert für alle Seiten, die vom IE im normalen (nicht modalen) Fenster geöffnet werden. Für modale Fenster (oder modale Dialoge) funktioniert dieses Beispiel nicht.

0

Sie einfach tun:

ie.Navigate("javascript:" + jsScript); 

wo also die Instanz von Internetexplorer ist

+1

Sehr begrenzt! in Bezug darauf, welchen Code Sie ausführen können! –

Verwandte Themen