2010-08-18 11 views
7

estoy usandoLa ejecución de una función de JavaScript en una instancia de Internet Explorer

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer() 

para controlar/automatizar una instancia de Internet Explorer. En ciertas páginas, me gustaría ejecutar una función de JavaScript (init()). Parece que la mejor manera de hacer esto es utilizar un método InvokeScriptHtmlDocument 's y he estado tratando el siguiente sin suerte:

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

no lo consigue porque doc es nulo. Parece que no puedo obtener un System.Windows.Forms.HtmlDocument de ie.Document. Además de intentar lo anterior, también he intentado:

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

y

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

¿Alguna idea sobre cómo puedo conseguir que esto funcione - o una mejor manera de ejecutar secuencias de comandos en la página?

Gracias!

EDITAR:

Otra forma de ejecutar una función de JavaScript parece ser:

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

Pero la línea

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

genera un error que se trata de un reparto no válido (InvalidCastException) - aunque IntelliSense (y MSDN) dicen doc.parentWindow es un IHTMLWindow2. ¿Algunas ideas? (También me he asegurado de una página se ha cargado completamente antes de ejecutar ese código)

Respuesta

6

El problema tenía que ver con rosca - He perdido tanto tiempo con asuntos STA que uno pensaría que iba a aprender por ahora :).

De todos modos, encontré la manera de obtener el segundo bit de código que publiqué funcionando y ejecutando las funciones de JavaScript en la ventana IE. Aquí está el código:

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

         mshtml.HTMLDocument doc = ie.Document; 

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


       })); 

Espero que ayude a alguien!

+0

Su respuesta sería más probable que lo ayude si usted explicó específicamente lo que hizo para resolver el problema de enhebrado. :-) – EricLaw

0

El SHDocVw.InternetExplorer.Document es de tipo mshtmlHTMLDocumentClass, por lo que necesita para hacer referencia Microsoft.mshtml

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

El es decir, objeto también tiene que navegar en algún lugar para que el documento tenga un valor. como

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

init Total:

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

Gracias por su respuesta, pero estoy teniendo problemas para conseguir que la línea de trabajo. Da el siguiente error de compilación: "Tipo de interoperabilidad 'mshtml.HTMLDocumentClass' no se puede incrustar. En su lugar, utilice la interfaz correspondiente." ¿Algunas ideas? – Evan

+0

(con esa línea me refiero a "mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass) ie.Document;" – Evan

+0

¿Agregó una referencia a Microsoft.mshtml en sus referencias? (No en la Interoperación) Está bajo la lista de .net referencias. –

1

Tienes que acceder a document.parentWindow en un hilo STA. Esto puede ayudarlo:

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

Este es un ejemplo de cómo obtener el Documento de alguna página.Está cerca de los ejemplos que se muestran arriba con la diferencia pequeña (pero importante) - Estoy usando el método Navigate2 - este funciona correctamente.

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); 
} 

Este ejemplo funcionará para todas las páginas que abre IE en la ventana Regular (no modal). Para ventanas modales (o diálogos modales), este ejemplo no funciona.

0

usted puede hacer simple:

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

donde es decir, es la instancia de InternetExplorer

+1

¡Muy limitado! en términos de qué código puede ejecutar! –

Cuestiones relacionadas