2012-02-02 82 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); 
     } 
    }; 
}