Управление веб-браузером: как захватить события документа?

Я использую элемент управления WPF WebBrowser для загрузки простой веб-страницы. На этой странице у меня есть якорь или кнопка. Я хочу зафиксировать событие нажатия этой кнопки в моем коде приложения (т.е. На С#).

Есть ли способ, которым элемент управления WebBrowser позволяет регистрировать события кликов на загруженных элементах страницы?

Кроме того, возможно ли передавать события, инициированные событиями между страницей и веб-браузером? Все вышеизложенное должно быть возможно, если я прав?

  • Изменить: Возможное решение:

Я нашел следующую ссылку, которая может быть решением. Я еще не тестировал его, но это того стоит. Будет обновлен этот вопрос в зависимости от результатов моих тестов.

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

Ответ 1

ОК Ответ найден - протестирован и работает:

  • Добавьте ссылку со вкладки COM: Библиотека объектов HTML Microsoft

Ниже приведен пример кода:

Вам понадобятся два компонента: WebBrowser (webBrowser1) и TextBox (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;
    }
}

Ответ 2

Вот еще один пример.

Я пытался ввести удаленный файл javascript и выполнить некоторый код, когда он готов, добавив элемент DOM <script src="{path to remote file}" /> в заголовок, по существу ту же идею, что и jQuery.getScript(url, callback).

Код ниже отлично работает.

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