2012-02-02 86 views
10

我正在使用WPF的WebBrowser控件加载一个简单的网页。在这个页面上我有一个锚或一个按钮。我想在后面的应用程序代码中捕获该按钮的单击事件(即在C#中)。Web浏览器控件:如何捕获文档事件?

的是,有WebBrowser控件的方式来捕捉所加载的页面的元素单击事件?

此外,是否有可能进行沟通事件触发页面和web浏览器之间的数据?以上所有应该是可能的我是对的吗?

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

我发现下面的链接,可能是一个解决办法。我还没有测试过,但它值得拍摄。将根据我的测试结果更新这个问题。取自

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

回答

13

好的答案发现 - 测试,它的工作原理:Microsoft HTML对象:

  • 从名为COM选项卡添加引用图书馆

下面是一个例子代码:

您将需要两个组件:web浏览器(webBrowser1)和一个文本框(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 2012-02-29 11:55:25

+1

它似乎只工作20%的时间对我来说,大部分时间它不能称之为“ClickEventHandler”即使LoadCompleted方法没有例外,我可以看到...任何想法完全结束?我张贴了关于在这里:​​http://stackoverflow.com/questions/35058874/wpf-webbrowser-open-links-in-default-browser – 2016-01-28 10:32:10

+1

通过@Bassem引用的文章codegain现在可以在这里找到:HTTP:// WWW .dotnetfunda.com /用品/显示/ 840 /工作与-网页浏览器功能于WPF – 2017-05-16 14:24:50

2

下面是另一个例子。

我试图在准备好时加入了DOM元素<script src="{path to remote file}" />的头,基本上是相同的想法jQuery.getScript(url, callback)注入远程JavaScript文件,并执行一些代码..下面

的代码工作正常。

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