如何在外部浏览器中打开webBrowser控件中的链接

本文关键字:webBrowser 控件 链接 外部 浏览器 | 更新日期: 2023-09-27 18:26:00

我的Windows窗体应用程序中有一个textBox和一个webBrowser控件。每当用户在textBox中输入HTML代码时,webBrowser控件就会显示其编译后的形式

private void textBox2_TextChanged(object sender, EventArgs e)
{
    webBrowser1.DocumentText = textBox2.Text;
}

但每当我单击webBrowser控件中的链接时,它都会在同一个webBrowser控件中将其打开。我想要的是它应该在系统的默认web浏览器中打开。那么,这个webBrowser控件是否有处理链接单击的事件?

如何在外部浏览器中打开webBrowser控件中的链接

最简单的方法是拦截Navigation事件。

public void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    //cancel the current event
    e.Cancel = true;
    //this opens the URL in the user's default browser
    Process.Start(e.Url.ToString());
}

我想为这个答案添加更多内容,

每次更改webBrowser的内容时,都会执行CozwebBrowser1Navigation方法。

在您的情况下,每当您将值设置为DocumentText时,就会调用此方法,当没有url且其默认值为about:black。所以我们也应该检查一下,否则它不会加载任何内容。

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        if (!(e.Url.ToString().Equals("about:blank", StringComparison.InvariantCultureIgnoreCase)))
        {
            System.Diagnostics.Process.Start(e.Url.ToString());
            e.Cancel = true;
        }
    }

这里的代码应该可以工作:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    System.Diagnostics.Process.Start(e.Url.ToString());
    e.Cancel = true;
}

我试着这样做是为了确保它有效,它确实有效!

希望这能有所帮助!!

Process.Start将在默认浏览器中打开URL,然后您只需告诉WebBrowser控件取消导航。

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    Process.Start(e.Url.ToString());
    e.Cancel = true;
}

我刚刚创建了一个示例应用程序来测试它——它很有效。

也许您可以尝试在Navigation事件中使用Process.Start()

因为没有人对其中包含target="_blank"的链接做出正确的回答。我会尝试这样做。

首先,为什么这不起作用?因为当用户单击web浏览器控件中的链接时,它不会触发导航事件,而是触发新窗口事件。在新窗口事件中,您无权访问被单击以中断新窗口并打开默认窗口的url或元素。以下是你的操作方法。

首先,在文档完成事件中添加以下代码。

    private void webBrowserControl_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        string tagUpper = "";
        foreach (HtmlElement tag in (sender as WebBrowser).Document.All)
        {
            tagUpper = tag.TagName.ToUpper();
            if((tagUpper == "AREA") || (tagUpper == "A"))
            { 
                tag.MouseUp += new HtmlElementEventHandler(this.link_MouseUp);
            }
        }
    }

这样做的目的是遍历所有html元素标记,并找到您在if语句中定义的所有标记。对于我的案例,我也需要AREA标签。你可以抓住任何你想要的标签。然后,我们将一个点击事件附加到该元素上。

接下来,我们用这段代码创建事件本身。

    void link_MouseUp(object sender, HtmlElementEventArgs e)
    {
        Regex pattern = new Regex("href='''"(.+?)'''"");
        Match match = pattern.Match((sender as HtmlElement).OuterHtml);
        string link = match.Groups[1].Value;
        Process.Start(link);
    }

这段代码建立了一个正则表达式模式,您很可能需要根据自己的需要更改此模式。我建议在这里添加一个断点,看看regex需要什么样子。您可以在regex链接中测试regex。请确保使用括号进行分组。我还建议使用问号来避免贪婪地匹配。然后,我们根据该模式进行匹配,并从匹配的组中获取url。在那之后,这只是一个使用该url启动进程的例子。这将打开默认浏览器,或者如果默认浏览器已打开,则添加一个新选项卡。

我们需要做的最后一件事是取消链接的默认逻辑。我们使用以下代码在NewWindow事件中执行此操作。

    private void webBrowserControl_NewWindow(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
    }