Web浏览器控件:如何捕获文档事件?

10

我正在使用WPF的WebBrowser控件加载一个简单的网页,该页面上有一个锚点或按钮。我想在我的应用程序代码中(即在C#代码中)捕获该按键的点击事件。

WebBrowser控件是否有一种方法可以捕获加载页面元素的点击事件?

此外,是否可能在页面和WebBrowser之间传递触发事件的数据?以上所有内容都应该是可能的,对吗?

  • 编辑:可能的解决方案:

我找到了下面的链接,这可能是一个解决方案。我还没有测试过它,但值得一试。根据我的测试结果更新这个问题。

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

2个回答

14

好的,找到了答案 - 经过测试可以使用:

  • 从 COM 选项卡中添加一个名为Microsoft HTML Object Library的引用

以下是示例代码:

需要两个组件: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;
    }
}

1
由于没有其他答案,我将选择这个作为答案。尽管我找到了更好的解决方法。该方法在http://www.codegain.com/articles/wpf/ieprogramming/working-with-webbrowser-in-wpf.aspx中有详细描述,并且使用了一个名为ObjectForScriptingHelper的类。非常容易实现并且效果很好。 - Bassem
1
似乎只有20%的时间它能正常工作,大部分时间它无法调用“ClickEventHandler”,即使LoadCompleted方法完全完成且我看不到任何异常... 有什么想法吗? 我在这里发布了相关问题:http://stackoverflow.com/questions/35058874/wpf-webbrowser-open-links-in-default-browser - Nick Thissen
5
@Bassem提到的codegain文章现在可以在这里找到:http://www.dotnetfunda.com/articles/show/840/working-with-webbrowser-in-wpf - Jim Simson

2
这是另一个例子。
我试图通过在头部添加DOM元素<script src="{远程文件路径}" />来注入远程javascript文件并在准备好时执行一些代码,基本上和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);
        }
    };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接