如何在C#中使用默认浏览器打开页面

367
我正在设计一个小型的C#应用程序,其中包含一个Web浏览器。我当前在我的电脑上将所有默认设置都设置为Google Chrome是我的默认浏览器,但是当我在应用程序中单击链接以在新窗口中打开时,它会打开Internet Explorer。是否有办法使这些链接在默认浏览器中打开?或者我的电脑有什么问题吗?
我的问题是应用程序中有一个Web浏览器,所以假设你去Google并键入“堆栈溢出”,然后右键点击第一个链接并单击“在新窗口中打开”,它会在IE中而不是Chrome中打开。这是我编码不当还是我的计算机设置不正确?
===编辑===
这真的很烦人。我已经知道浏览器是IE了,但以前一切都运行正常。当我单击链接时,它会在Chrome中打开。当时我使用SharpDevelop制作应用程序,因为我无法启动C# Express。我进行了全新的Windows安装,并且由于我在应用程序中还没有走得太远,所以我决定重新开始,现在我遇到了这个问题。这就是为什么我不确定它是我的电脑出了问题还是其他原因。为什么IE会在单击链接时启动整个浏览器,而不是仅在默认浏览器中打开新链接?

呵呵,说服IE为您打开Chrome会是一场艰苦的战斗。嗯,不只是有点困难。如果直接运行IE,这也不起作用。同样,如果IE是默认浏览器,Chrome也不行。 - Hans Passant
  1. 获取开始菜单目录,搜索 Firefox 或 Chrome 的标准名称,请确保找到。如果未找到,则执行第 2 步。
  2. 获取标准安装位置列表,无论是 32 位还是 64 位,使用 Chrome 或 FF 存在的任何一个。如果没有,则执行第 3 步。
  3. 最后的手段是使用答案。
- bh_earth0
21个回答

3

这对我来说打开了默认设置:

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

你是否正在使用某个包,该包提供了LinkText属性的EventArgs? - Nick Roberts

3

我尝试过

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

这个方法适用于大多数情况,但是当我遇到一个指向文件的URL时,就会出现问题:

系统找不到指定的文件。

因此,我尝试了这个解决方案,稍微修改后它可以正常工作:

System.Diagnostics.Process.Start("explorer.exe", $"\"{uri}\"");

如果没有用""把URL包裹起来,浏览器会打开你的文档文件夹。


1
所以基本上你的回答是一条评论,或者至少是一个重复。 - Vega
@Vega 抱歉,我没有足够的声望来添加评论... 我添加了这个答案,因为这个修改在这个帖子中没有提到。 - Code A Software
2
这个(终于)解决了在 .Net Core 上出现的“找不到文件”错误。 - gjvdkamp
1
这个没有引号的解决方案对我很有效,直到我有一个带查询字符串的URL,它打开了文档文件夹。这个解决方案也适用于带查询字符串的URL。 - h3n

2

dotnet core如果使用Process.Start(URL)会抛出错误。以下代码可以在dotnet core中正常工作。您可以使用任何浏览器代替Chrome


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

6
不是问题的答案,代码不知道默认浏览器是什么。 - Arjan
2
看起来用户需要先打开 Chrome 才能使这个工作。 - beppe9000

2

重复的问题。请参考 https://stackoverflow.com/a/66066710/199364。 - undefined

1
在UWP中:
await Launcher.LaunchUriAsync(new Uri("http://google.com"));

这是Launcher.LaunchUriAsync。请点击链接查看完整示例。有趣的是,返回值允许调用者知道URL是否已经打开。请注意,此方法仅适用于Windows 8/Server2012/Phone8及以上版本。如果软件需要与旧版本兼容,则不能使用该方法。 - Stéphane Gourichon

0

动态打开

string addres= "Print/" + Id + ".htm";
           System.Diagnostics.Process.Start(Path.Combine(Environment.CurrentDirectory, addres));

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

0

我想评论上面的一个答案,但我还没有足够的声望。

System.Diagnostics.Process.Start("explorer", "stackoverflow.com");

几乎可以工作,除非URL有查询字符串,在这种情况下,此代码只会打开文件浏览器窗口。关键似乎是UseShellExecute标志,如Alex Vang的答案中所述(除了在Web浏览器中启动随机字符串的其他评论)。


0

为了解决Net 6的问题,我使用了ChromeLauncher中的代码,这样默认浏览器就会像它一样。

internal static class ChromeLauncher
{
    private const string ChromeAppKey = @"\Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe";

    private static string ChromeAppFileName
    {
        get
        {
            return (string) (Registry.GetValue("HKEY_LOCAL_MACHINE" + ChromeAppKey, "", null) ??
                                Registry.GetValue("HKEY_CURRENT_USER" + ChromeAppKey, "", null));
        }
    }

    public static void OpenLink(string url)
    {
        string chromeAppFileName = ChromeAppFileName;
        if (string.IsNullOrEmpty(chromeAppFileName))
        {
            throw new Exception("Could not find chrome.exe!");
        }
        Process.Start(chromeAppFileName, url);
    }
}

0

这对于.NET 5(Windows)非常有效:

 ProcessStartInfo psi = new ProcessStartInfo {
   FileName = "cmd.exe",
     Arguments = $ "/C start https://stackoverflow.com/",
     WindowStyle = ProcessWindowStyle.Hidden,
     CreateNoWindow = true
 };
 Process.Start(psi);

1
这确实很好用,但不仅仅是对于用户 - 它可以用来执行恶意代码,因为你创建了一个cmd.exe进程并传递参数给它。 - fyb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接