Открыть ссылку в новой вкладке (элемент управления WebBrowser)

кто-нибудь знает, как нажать на ссылку в элементе управления WebBrowser в приложении WinForms, а затем открыть эту ссылку на новой вкладке внутри моего TabControl?

Я искал в течение нескольких месяцев, видел много учебников / статей / образцов кода, но кажется, что никто никогда не пробовал это в C# раньше.

любые советы/образцы высоко ценятся.

спасибо.

6 ответов


основываясь на ваших комментариях, я понимаю, что вы хотите поймать действие "открыть в новом окне" для элемента управления WebBrowser и переопределить поведение по умолчанию, чтобы открыть новую вкладку внутри вашего приложения.

чтобы выполнить это надежно, вам нужно получить событие NewWindow2, которое предоставляет ppDisp (настраиваемый указатель на элемент управления WebBrowser, который должен открыть новое окно). Все остальные потенциальные взломанные решения (например, получение последней ссылки выбирается пользователем перед началом мероприятия OpenWindow) не являются оптимальными и в случаях.

к счастью, есть (относительно) простой способ выполнить это, все еще используя систему.Окна.Формы.Элемент управления 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 с именем "Tabs" и начальную вкладку, содержащую дочерний элемент управления закрепленный ExtendedWebBrowser с именем "InitialWebBrowser")

Не забудьте отменить регистрацию событий, когда вкладки закрыты!


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

следующий код работает, просто следуйте первому ответу для создания класса 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); 
        }

Я провел небольшое исследование по этой теме, и не нужно делать ВСЮ com-сантехнику, которая присутствует в классе ExtendedWebBrowser, так как этот код уже присутствует в сгенерированном взаимодействии.SHDocVw. Таким образом, я смог использовать более естественную конструкцию ниже, чтобы подписаться на событие NewWindow2. В Visual Studio мне пришлось добавить ссылку на "Microsoft Internet Controls".

    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.


вы просто отменяете новое событие окна и обрабатываете навигацию и вкладку самостоятельно.

вот полностью рабочий пример. Это предполагает, что у вас есть tabcontrol и по крайней мере 1 страница вкладки.

using System.ComponentModel;
using System.Windows.Forms;

namespace stackoverflow2
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.webBrowser1.NewWindow += WebBrowser1_NewWindow;
            this.webBrowser1.Navigated += Wb_Navigated;
            this.webBrowser1.DocumentText=
             "<html>"+
             "<head><title>Title</title></head>"+
             "<body>"+
             "<a href = 'http://www.google.com' target = 'abc' > test </a>"+
             "</body>"+
             "</html>";
        }
        private void WebBrowser1_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel = true; //stop normal new window activity

            //get the url you were trying to navigate to
            var url= webBrowser1.Document.ActiveElement.GetAttribute("href");

            //set up the tabs
            TabPage tp = new TabPage();
            var wb = new WebBrowser();
            wb.Navigated += Wb_Navigated;
            wb.Size = this.webBrowser1.Size;
            tp.Controls.Add(wb);
            wb.Navigate(url);
            this.tabControl1.Controls.Add(tp);
            tabControl1.SelectedTab = tp;
        }

        private void Wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            tabControl1.SelectedTab.Text = (sender as WebBrowser).DocumentTitle;
        }
    }
}

в элементе управления веб-браузером нет табуляции, поэтому вам нужно самостоятельно обрабатывать вкладки. Добавить закладку контроль над веб-браузера и создать новый веб-браузер, когда открываются новые вкладки. Поймать и отменить, когда пользователь открывает новые окна и открыть новые вкладки вместо этого.