Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在外部浏览器中打开webBrowser控件中的链接?_C#_.net_Winforms_Webbrowser Control - Fatal编程技术网

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

C# 如何在外部浏览器中打开webBrowser控件中的链接?,c#,.net,winforms,webbrowser-control,C#,.net,Winforms,Webbrowser Control,我的Windows窗体应用程序中有一个文本框和一个webBrowser控件。每当用户在textBox中输入HTML代码时,webBrowser控件都会显示其已编译的表单。此操作的代码: private void textBox2_TextChanged(object sender, EventArgs e) { webBrowser1.DocumentText = textBox2.Text; } 但每当我单击webBrowser控件中的链接时,它都会在同一webBrowser控件中打

我的Windows窗体应用程序中有一个文本框和一个webBrowser控件。每当用户在textBox中输入HTML代码时,webBrowser控件都会显示其已编译的表单。此操作的代码:

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

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

也许您可以尝试在导航事件上使用
Process.Start()

最简单的方法是拦截事件


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

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    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;
}
我试过这个,以确保它的工作和它


希望这有帮助

我想对这个答案再补充一点

因为每次更改webBrowser的内容时,都会执行导航方法

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

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

因为没有人对其中包含
target=“\u blank”
的链接做出过体面的回答。我会尝试这样做

首先,为什么这不起作用?因为当用户单击web浏览器控件中的链接时,它不会触发导航事件,而是触发新窗口事件。在new window事件中,您无权访问被单击以中断新窗口并打开默认窗口的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);
            }
        }
    }
    private void webBrowserControl_NewWindow(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
    }
这样做的目的是遍历所有html元素标记,并找到在if语句中定义的所有标记。对于我的案例,我也需要区域标签。你可以抓住任何你想要的标签。然后,我们在该元素上附加一个click事件

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

    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。确保使用括号进行分组。我还建议不要用问号来表示贪婪。然后,我们根据该模式进行匹配,并从匹配的组中获取url。在此之后,只需使用该url启动流程。这将打开默认浏览器,或者如果默认浏览器已打开,则添加新选项卡

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

    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);
            }
        }
    }
    private void webBrowserControl_NewWindow(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
    }

我想知道如果你在web浏览器控件
target=“\u blank”
?@Tombatron中创建了所有链接,会发生什么情况?我刚刚发布了这个问题的新答案,请参考。我遇到了同样的问题,并尝试了上述解决方案。当chrome是默认浏览器时工作。但是当IE 10是默认浏览器时,它仍然在webbrowser控件中打开。有什么想法吗?我也在尝试这种方法,但是如果链接有一个空白目标,导航事件不会触发!我找不到任何办法this@EricLegault我刚刚发布了一个关于这个问题的新答案,请参考。此外,请参阅下面的答案(@Trikaldarshi,@Gaugeforever),以获得完整的解决方案。