Подтвердить что ты не робот

Открыть ссылку в новой TAB (WebBrowser Control)

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

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

Приветствуются любые советы/примеры.

Спасибо.

4b9b3361

Ответ 1

На основе ваших комментариев я понимаю, что вы хотите уловить действие "Открыть в новом окне" для элемента управления 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" )

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

Ответ 2

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

Ответ 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); 
        }

Ответ 4

Я немного поработал над этой темой, и вам не нужно делать всю COM-сантехнику, которая присутствует в классе ExtendedWebBrowser, так как этот код уже присутствует в сгенерированном Interop.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.

Ответ 5

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

Вот полностью рабочий пример. Предполагается, что у вас есть вкладка и минимум 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;
        }
    }
}

Ответ 6

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