C# 在win10/win11调用默认浏览器打开网页

对于使用C#调用默认浏览器打开网页这个话题,网上资源一般都用的是Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command\");或者System.Diagnostics.Process.Start("explorer.exe", "...")之类,但在实践过程中发现前者在Windows 10之后修改默认浏览器并不会修改注册表的这一字节而导致只会调用Microsoft Edge,后者更是有概率直接失效,所以需要换个办法。

思路是:

1、在新的注册表字段HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Shell\Associations\URLAssociations\(http|https)\UserChoice读取到默认浏览器,字段值一般为ChromeHTML,MSEdgeHTM之类。

2、通过读取到的默认浏览器字段去HKEY_CLASSES_ROOT\...\shell\open\command获取浏览器path。

3、在此期间出错或是读取到null时使用旧方法,以兼容旧操作系统。

代码如下:

private static void OuterVisit(string url)
{
	dynamic? kstr;
	string s;
	try
	{
		// 从注册表中读取默认浏览器可执行文件路径
		RegistryKey? key2 = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command\");
        RegistryKey? key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice\");
        if (key != null)
		{
			kstr = key.GetValue("ProgId");
			if (kstr != null)
			{
				s = kstr.ToString();
				// "ChromeHTML","MSEdgeHTM" etc.
				if (Registry.GetValue(@"HKEY_CLASSES_ROOT\" + s + @"\shell\open\command", null, null) is string path)
				{
					var split = path.Split('"');
					path = split.Length >= 2 ? split[1] : "";
					if (path != "")
					{
						Process.Start(path, url);
						return;
                    }
                }
             }
		}
		if (key2 != null)
        {
			kstr = key2.GetValue("");
			if (kstr != null)
			{
				s = kstr.ToString();
				var lastIndex = s.IndexOf(".exe", StringComparison.Ordinal);
				if (lastIndex == -1)
				{
					lastIndex = s.IndexOf(".EXE", StringComparison.Ordinal);
				}
				var path = s.Substring(1, lastIndex + 3);
				var result1 = Process.Start(path, url);
				if (result1 == null)
				{
					var result2 = Process.Start("explorer.exe", url);
					if (result2 == null)
					{
						Process.Start(url);
					}
				}
			}
		}
		else
		{
			var result2 = Process.Start("explorer.exe", url);
			if (result2 == null)
			{
				Process.Start(url);
			}
		}
	}
	catch
	{
		CommonTools.ShowMsgBox("调用浏览器失败。链接已经被复制到您的剪贴板,请手动操作。");
		Clipboard.SetText(url);
    }
}

引用:

1、如何获取chrome.exe路径(c#) - 爱码网 (likecs.com)

2、C#打开系统浏览器(默认浏览器,谷歌,火狐等…可以自行扩展)_Lingbug的博客-CSDN博客_c# 打开浏览器

3、如何通过Windows 10上的注册表查找默认浏览器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值