2009-08-17 33 views
12

是否有人知道如何在WinForms應用程序的WebBrowser控件中單擊鏈接,然後在TabControl中的新選項卡中打開該鏈接?在新的TAB(WebBrowser控件)中打開鏈接

我一直在尋找幾個月,看過很多教程/文章/代碼示例,但它似乎沒有人曾經在C#中嘗試過。

任何意見/樣本非常感謝。

謝謝。

+0

我是其他人,遇到麻煩時,即打開每當我點擊網頁鏈接我自己的瀏覽器。嘗試了所有上述但沒有運氣,第一個答覆由羅伯特 我在設計模式中添加ExtendedWebBrowser,但我仍然在最後一行代碼中獲得下方的紅線(InitialTabBrowser),並且'InitialTabBroswer的警告不存在於當前的情況下'。任何更多的提示/建議將會很好。 – 2012-01-25 17:55:36

回答

25

根據您的意見,我知道你是想捕獲WebBrowser控件的「在新窗口打開」動作,並覆蓋默認行爲在你的應用程序,而不是內部的一個新標籤中打開。

爲了可靠地實現這一點,您需要獲取NewWindow2事件,該事件公開ppDisp(可打開新窗口的WebBrowser控件的可設置指針)。 所有其他潛在的攻擊解決方案(例如獲取用戶在OpenWindow事件之前選擇的最後一個鏈接)都不是最優的,並且在角落案例中必然會失敗。

幸運的是,有一種(相對)簡單的方法來完成此操作,同時仍然使用System.Windows.Forms.WebBrowser控件作爲基礎。您只需要擴展WebBrowser並攔截NewWindow2事件,同時提供ActiveX實例的公共訪問權限(用於在新選項卡中傳入ppDisp)。這之前已經完成,毛裏西奧·羅哈斯擁有了一個完整的工人階級「ExtendedWebBrowser」一個很好的例子:

http://blogs.artinsoft.net/mrojas/archive/2008/09/18/newwindow2-events-in-the-c-webbrowsercontrol.aspx

一旦你有了ExtendedWebBrowser類,所有你需要做的是爲NewWindow2和點設置處理程序ppDisp到新選項卡中的瀏覽器。下面是我放在一起的例子:

private void InitializeBrowserEvents(ExtendedWebBrowser SourceBrowser) 
    { 
     SourceBrowser.NewWindow2 += new EventHandler<NewWindow2EventArgs>(SourceBrowser_NewWindow2); 
    } 

    void SourceBrowser_NewWindow2(object sender, NewWindow2EventArgs e) 
    { 

     TabPage NewTabPage = new TabPage() 
     { 
      Text = "Loading..." 
     }; 

     ExtendedWebBrowser NewTabBrowser = new ExtendedWebBrowser() 
     { 
      Parent = NewTabPage, 
      Dock = DockStyle.Fill, 
      Tag = NewTabPage 
     }; 

     e.PPDisp = NewTabBrowser.Application; 
     InitializeBrowserEvents(NewTabBrowser); 

     Tabs.TabPages.Add(NewTabPage); 
     Tabs.SelectedTab = NewTabPage; 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

     InitializeBrowserEvents(InitialTabBrowser); 

    } 

(假定的TabControl名爲「標籤」和初始選項卡包含子控件停靠ExtendedWebBrowser名爲「InitialWebBrowser」)

不要忘記註銷事件時的標籤已關閉!

+0

非常感謝羅伯特的示例代碼和鏈接:-)我有幾個問題,我添加了一個類,並將其稱爲ExtendedWebBrowser.cs,然後將示例代碼添加到Form1.cs文件中,當我嘗試調試時,它給了我以下錯誤:「參數'1'不能從'System.Windows.Forms.WebBrowser'轉換爲'ExtendedWebBrowser'。」藍色的波浪線出現在下面的代碼行下面:InitializeBrowserEvents(InitialTabBrowser);你知道那是什麼嗎? – 2009-09-06 06:09:31

+1

確保您的InitialWebBrowser類型爲「ExtendedWebBrowser」 - 看起來您仍在使用「WebBrowser」。要添加ExtendedWebBrowser,請查看您的工具箱。你應該看到它旁邊有一個小齒輪符號。在InitialWebBrowser控件的設計模式中,您應該添加到表單中。 – 2009-09-06 15:54:42

+0

非常感謝你爲這個羅伯特。你一直很有幫助。 :) – 2009-09-06 16:28:30

4
private Uri _MyUrl;  

System.Windows.Forms.WebBrowser browser = new System.Windows.Forms.WebBrowser(); 
browser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(browser_Navigating); 


void browser_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs e) 
{ 
    _MyUrl = e.Url; 
    e.Cancel; 
} 
+0

謝謝sshow,這是非常有幫助的,雖然我正在嘗試獲取發送到新瀏覽器窗口的url,以便我可以阻止新瀏覽器打開並在我自己的瀏覽器中的新選項卡中打開該URL。例如,當我右鍵單擊一個鏈接,並選擇在新窗口中打開我不希望它打開一個新的IE瀏覽器,我希望它在我自己的瀏覽器中的新選項卡中打開 – 2009-08-17 15:10:20

+1

也許你可以覆蓋ContextMenu 「在新窗口中打開」按鈕。我從來沒有做過這樣的事情。祝你好運! – sshow 2009-08-17 19:22:03

+0

謝謝sshow如果我成功了,我會發布代碼給大家incase他們想知道,因爲我從來沒有見過任何人在c#上的任何網絡在任何地方做這個... – 2009-08-18 10:21:24

-2

Web瀏覽器控件沒有標籤,因此您需要自己處理標籤。在Web瀏覽器控件上添加一個選項卡控件,並在打開新選項卡時創建新的Web瀏覽器控件。當用戶打開新窗口並改爲打開新標籤時,趕上並取消。

3

下面的代碼工作,只需按照創建ExtendedWebBrowser類的第一個答覆。

我正在使用它打開一個新選項卡,但它也可以使用瀏覽器而不是IE打開一個新窗口。

希望它有幫助。

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (current_tab_count == 10) return; 
     TabPage tabPage = new TabPage("Loading..."); 
     tabpages.Add(tabPage); 
     tabControl1.TabPages.Add(tabPage); 
     current_tab_count++; 
     ExtendedWebBrowser browser = new ExtendedWebBrowser(); 
     InitializeBrowserEvents(browser); 
     webpages.Add(browser); 
     browser.Parent = tabPage; 
     browser.Dock = DockStyle.Fill; 
     browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted); 
     browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged); 
     browser.Navigated += Browser_Navigated; 
     browser.IsWebBrowserContextMenuEnabled = true; 
public void InitializeBrowserEvents(ExtendedWebBrowser browser) 
    { 
     browser.NewWindow2 += new EventHandler<ExtendedWebBrowser.NewWindow2EventArgs>(Browser_NewWindow2); 
    } 

    void Browser_NewWindow2(object sender, ExtendedWebBrowser.NewWindow2EventArgs e) 
    { 

     if (current_tab_count == 10) return; 
     TabPage tabPage = new TabPage("Loading..."); 
     tabpages.Add(tabPage); 
     tabControl1.TabPages.Add(tabPage); 
     current_tab_count++; 
     ExtendedWebBrowser browser = new ExtendedWebBrowser(); 
     webpages.Add(browser); 
     browser.Parent = tabPage; 
     browser.Dock = DockStyle.Fill; 
     browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted); 
     browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged); 
     browser.Navigated += Browser_Navigated; 
     tabControl1.SelectedTab = tabPage; 
     browser.Navigate(textBox.Text); 

     { 
      e.PPDisp = browser.Application; 
      InitializeBrowserEvents(browser); 
     } 
+0

非常感謝,很多開發人員。代碼完美地工作,你真棒!非常感謝你的配偶。 :D – 2009-11-06 06:27:49

3

我做了這個話題了一些研究,一個並不需要做的所有的COM管道是存在於ExtendedWebBrowser類,作爲代碼已經存在於產生Interop.SHDocVw。因此,我能夠使用下面更自然的構造來訂閱NewWindow2事件。在Visual Studio中,我不得不添加對「Microsoft Internet控件」的引用。

using SHDocVw; 
    ... 

    internal WebBrowserSsoHost(System.Windows.Forms.WebBrowser webBrowser,...) 
    { 
     ParameterHelper.ThrowOnNull(webBrowser, "webBrowser"); 
     ... 

     (webBrowser.ActiveXInstance as WebBrowser).NewWindow2 += OnNewWindow2; 
    } 

    private void OnNewWindow2(ref object ppDisp, ref bool Cancel) 
    { 
     MyTabPage tabPage = TabPageFactory.CreateNewTabPage(); 
     tabPage.SetBrowserAsContent(out ppDisp); 
    } 

請更多信息閱讀http://bit.ly/IDWm5A。這是系列中的第5頁,爲了全面瞭解我不得不回頭閱讀第3 - > 5頁。

+0

這是什麼?如何使用它? – Kosmos 2016-07-11 19:28:14

相關問題