2012-02-02 20 views
10

Estoy usando el control WebBrowser de WPF para cargar una página web simple. En esta página tengo un ancla o un botón. Quiero capturar el evento click de ese botón en el código de mi aplicación (es decir, en C#).Control del navegador web: cómo capturar eventos del documento?

¿Hay alguna manera para que el control WebBrowser capture eventos de clic en los elementos de la página cargada?

Además, ¿es posible comunicar datos desencadenados por eventos entre la página y WebBrowser? Todo lo anterior debería ser posible ¿estoy en lo cierto?

  • Editar: solución probable:

He encontrado el siguiente enlace que podría ser una solución. Aún no lo he probado, pero vale la pena. Actualizaré esta pregunta dependiendo de los resultados de mi prueba.

http://support.microsoft.com/kb/312777

Respuesta

13

respuesta Ok encontró - probado y funciona:

  • agregar una referencia de la ficha COM denominado: Microsoft HTML Objeto Biblioteca

El siguiente es un ejemplo de código:

Se necesitan dos componentes: WebBrowser (WebBrowser1) y un cuadro de texto (textBox1)

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     webBrowser1.LoadCompleted += new LoadCompletedEventHandler(webBrowser1_LoadCompleted); 
    } 

    private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
     mshtml.HTMLDocument doc; 
     doc = (mshtml.HTMLDocument)webBrowser1.Document; 
     mshtml.HTMLDocumentEvents2_Event iEvent; 
     iEvent = (mshtml.HTMLDocumentEvents2_Event)doc; 
     iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); 
    } 

    private bool ClickEventHandler(mshtml.IHTMLEventObj e) 
    { 
     textBox1.Text = "Item Clicked"; 
     return true; 
    } 
} 
+1

Dado que no se dieron otras respuestas, voy a seleccionar esto como la respuesta. Aunque encontré una mejor manera de resolver este problema. El método se describe en http://www.codegain.com/articles/wpf/ieprogramming/working-with-webbrowser-in-wpf.aspx y utiliza una clase llamada ObjectForScriptingHelper. Muy fácil de implementar y funciona como un encanto. – Bassem

+1

Parece que solo funciona el 20% de las veces, la mayoría de las veces no se llama "ClickEventHandler" aunque el método LoadCompleted finaliza por completo sin excepciones que puedo ver ... ¿Alguna idea? Publiqué sobre esto aquí: http://stackoverflow.com/questions/35058874/wpf-webbrowser-open-links-in-default-browser –

+1

El artículo codegain referenciado por @Bassem ahora se puede encontrar aquí: http: // www .dotnetfunda.com/articles/show/840/working-with-webbrowser-in-wpf –

2

Aquí es otro ejemplo.

yo estaba tratando de inyectar un archivo javascript remota y ejecutar código cuando preparada mediante la adición de un elemento DOM <script src="{path to remote file}" /> a la cabecera, esencialmente la misma idea que jQuery.getScript(url, callback) ..

El código siguiente funciona bien.

HtmlElementCollection head = browser.Document.GetElementsByTagName("head"); 
if (head != null) 
{ 
    HtmlElement scriptEl = browser.Document.CreateElement("script"); 
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement; 
    element.src = url; 
    element.type = "text/javascript"; 
    head[0].AppendChild(scriptEl); 
    // Listen for readyState changes 
    ((mshtml.HTMLScriptEvents2_Event)element).onreadystatechange += delegate 
    { 
     if (element.readyState == "complete" || element.readyState == "loaded") 
     { 
      Callback.execute(callbackId); 
     } 
    }; 
} 
Cuestiones relacionadas