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

时间:2012-02-02 10:05:39

标签: c# javascript wpf

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

WebBrowser控件是否有办法捕获已加载页面元素上的点击事件?

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

  • 修改:可能的解决方案:

我找到了以下可能是解决方案的链接。我还没有测试过,但值得拍摄。将根据我的测试结果更新此问题。

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

2 个答案:

答案 0 :(得分:13)

确定答案已找到 - 经过测试且有效:

  • 从COM选项卡添加名为: Microsoft HTML对象库
  • 的引用

以下是示例代码:

您将需要两个组件: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 :(得分:2)

这是另一个例子。

我试图通过在标题中添加DOM元素<script src="{path to remote file}" />来注入远程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);
        }
    };
}