如何在C#中的默认浏览器中打开


257

我正在设计一个小型C#应用程序,其中有一个Web浏览器。我目前在计算机上使用所有默认值,例如Google chrome是我的默认浏览器,但是当我单击应用程序中的链接以在新窗口中打开时,它将打开Internet Explorer。有什么方法可以使这些链接在默认浏览器中打开吗?还是我的计算机出问题了?

我的问题是我的应用程序中有一个网络浏览器,所以说你去Google并输入“ stack stackover”,然后右键单击第一个链接,然后单击“在新窗口中打开”,它将在IE中而不是Chrome中打开。这是我编码不正确的东西,还是计算机上的设置不正确?

===编辑===

真烦人。我已经知道该浏览器是IE,但之前它运行良好。当我单击链接时,它以chrome打开。当时我使用Sharp开发来开发应用程序,因为我无法启动C#Express。我做了一个全新的Windows安装,由于我在应用程序中的进度不太好,所以我决定重新开始,现在遇到了这个问题。这就是为什么我不确定是否是我的计算机的原因。为什么当单击链接而不是在默认浏览器中简单地打开新链接时,IE会启动整个浏览器?


呵呵,说服IE为您打开Chrome将会是一场艰苦的战斗。好吧,一点也不。如果直接运行IE,这也不起作用。如果默认是IE,则可以使用Chrome。
汉斯·帕桑

@SLaks Mono?你在说什么?
肖恩

1)getstartMenuDir搜索Firefox或Chrome StandartName。如果找不到。2)获取曾经存在的32 64 chrome ff使用的标准安装位置的列表。如果不是3)不得已,请使用答案。
bh_earth0

Answers:


505

你可以写

System.Diagnostics.Process.Start("http://google.com");

编辑WebBrowser控件是IE的嵌入式副本。
因此,其中的任何链接都将在IE中打开。

若要更改此行为,您可以处理Navigating事件。


1
试试吧。使用Taskmgr.exe,您将看到iexporer.exe的两个副本正在运行。导航不会为进程外触发。
汉斯·帕桑

4
@Sean:是的。 Process.Start(e.Url.ToString())
SLaks

2
除非将浏览器exe指定为第一参数,否则本地url(file:///)不能与查询字符串一起使用。
HerrimanCoder

2
请注意,此can方法还会引入安全性问题,因为如果将“ url”替换为应用程序的物理路径,它也会执行
Gerrie Pretorius

1
@Spencer:确保URL受信任。
SLaks's

45

对于那些在dotnet core中发现此问题的人。我在这里找到了解决方案

码:

private void OpenUrl(string url)
{
    try
    {
        Process.Start(url);
    }
    catch
    {
        // hack because of this: https://github.com/dotnet/corefx/issues/10361
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            url = url.Replace("&", "^&");
            Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            Process.Start("xdg-open", url);
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            Process.Start("open", url);
        }
        else
        {
            throw;
        }
    }
}

谢谢!对我openxdg-open
有用

@Equiman不这样做吗?RuntimeInformation.IsOSPlatform(OSPlatform.OSX)还是在Linux上已经是真的?
乔尔·哈克斯

我做的。但是xdg-command返回“ xdg-open:找不到命令”。然后,我使用open命令进行了测试并开始工作。
Equiman

@Equiman,所以您说我应该切换elseif Linux和OSX以使其正常运行,或者macOS是否不属于OSX?
乔尔·哈克斯

1
我想不是...我的解决方案是另一种选择。
Equiman

38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

那应该解决你的问题


7
应该是“静态无效的GotoSite”
Behrooz

15

您是否尝试Process过此处提到的方法:http : //msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx

你可以用

Process myProcess = new Process();

try
{
    // true is the default, but it is important not to set it to false
    myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

1
UseShellExecute默认为true。
SLaks 2011年

4
@SLaks,谢谢。另一方面,必须提到它必须是重要的true
安德烈亚斯(Andreas)

1
对于那些懒得检查的人……过程需要“使用System.Diagnostics”
Nick Roberts

这似乎是WPF所需的路线。如果您这样做Process.Start(url),则不会打开新的浏览器窗口。
RubyHaus

5

看一下GeckoFX控件

GeckoFX是一个开源组件,可轻松将Mozilla Gecko(Firefox)嵌入到任何.NET Windows Forms应用程序中。GeckoFX使用干净的,带有完整注释的C#编写,是默认的基于Internet Explorer的WebBrowser控件的完美替代。


我的问题是我在应用程序中有一个Web浏览器,所以说你去Google并输入“ stack stackover”,然后右键单击第一个链接,然后单击“在新窗口中打开”,它将在IE中而不是Chrome中打开。这是我未正确编码的东西,还是计算机上的设置不正确
Sean

@SLaks:为什么这么说?我认为编写一个字符串并将其设置为GetDefaultBrowserPath()完全不困难。
医生

@Sean:如果您的应用程序中有一个Web浏览器,则默认情况下它将使用IE。导航事件可以帮助您解决这一问题。
医生

在意识到OP不想更改由单独的进程启动的默认浏览器之后,我修改了答案。
医生

5

尝试这个,老派的方法;)

public static void openit(string x)
    {
        System.Diagnostics.Process.Start("cmd", "/C start" + " " + x);
    }

使用:openit(“ www.google.com”);


2
不能,“ Shellsock”被利用吗?
2015年

@JosephLennox很好!可能值得一提的是,直接在URL上进行System.Diagnostics.Process.Start并不安全(任何?)!另一方面,如果用户正在(可能是)在其计算机上运行您的应用程序,则他们能做的最糟糕的事情就是破坏自己的系统:P
Ben

4
@Ben取决于输入来自何处。如果它是共享数据源,则一旦用户可以输入恶意命令,所有其他单击“转到”的用户将受到该用户的摆布。
丹·贝查德

4

经过大量研究后,我觉得给出的大多数答案都不适用于dotnet core。1 System.Diagnostics.Process.Start("http://google.com")。-不适用于dotnet核心

2.可以使用,但是如果默认浏览器是chrome,它将阻止新窗口打开

 myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();

以下是最简单的方法,将适用于所有情况。

Process.Start("explorer", url);

这为我解决了。
Rufw91

3

这为我打开了默认设置:

System.Diagnostics.Process.Start(e.LinkText.ToString());

是否正在使用一个为EventArgs提供LinkText属性的程序包?
尼克·罗伯茨

3

dotnet core如果使用则会引发错误Process.Start(URL)。以下代码将在中运行dotnet core。您可以添加任何浏览器代替Chrome

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);

3
不是Q的答案,代码也不知道默认浏览器是什么
Arjan

0

在UWP中:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));

这是Launcher.LaunchUriAsync。点击链接获取完整示例。有趣的是,返回值允许调用者知道URL是否打开。请注意,这适用于Windows 8 / Server2012 / Phone8及更高版本。如果该软件必须与旧版本兼容,则不能使用该软件。
斯特凡纳·古里科


0

使用
资源管理器的当前版本@“ Software \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION” 更新注册表

public enum BrowserEmulationVersion
{
    Default = 0,
    Version7 = 7000,
    Version8 = 8000,
    Version8Standards = 8888,
    Version9 = 9000,
    Version9Standards = 9999,
    Version10 = 10000,
    Version10Standards = 10001,
    Version11 = 11000,
    Version11Edge = 11001
}

key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.