内容目录
一,背景
这个需求看起来不复杂,但考虑通用话比较麻烦,一些用户还是用的win7,各种魔改版本。导致各种问题,通过一段时间测试,自己整理出来代码比较通用,可以处理各种用户情况。
二,代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Browser
{
class BrowserHelperV2
{
public void Open(string url)
{
//微软edge最新浏览器 google浏览器 360极速版本 360安全浏览器 火狐浏览器 默认浏览器
//循序自己调整,建议explorer 放在最后,最后用默认方式
//其他浏览器的执行,可以自己添加
//不一定成功,根据自己测试,只要注册表正常安装是没有什么问题的
string[] browserNameList = { "msedge.exe", "chrome.exe", "360chrome.exe", "360se.exe", "firefox.exe" };
processUrl(ref url);
foreach (var name in browserNameList)
{
bool ret = OpenBrowser(url, name);
if (ret)
{
return;
}
}
//默认浏览器
OpenDefaultBrowser(url);
}
private bool OpenBrowser(string url, string name)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
try
{
startInfo.FileName = name;
startInfo.Arguments = url;
Process.Start(startInfo);
return true;
}
catch (Exception e)
{
Debug.WriteLine("打开异常:" + e.Message);
}
return false;
}
private bool OpenDefaultBrowser(string url)
{
try
{
//要引入1.2的版本,网上单独下载,但微软官方没有找到有为什么不用1.0的
Shell32.Shell shell = new Shell32.Shell();
shell.Open(url);
return true;
}
catch (Exception)
{
return OpenBrowser(url, "explorer.exe");
}
}
/// <summary>
/// 处理URL,防止解析默认浏览器无法解析格式导致问题
/// </summary>
/// <param name="url"></param>
private void processUrl(ref string url)
{
if(url.Length > 5)
{
var begin_url = url.Substring(0, 5);
if (!(begin_url.StartsWith("https") || begin_url.StartsWith("http")))
{
url = "http://" + url;
}
}
}
}
}
三,逻辑
先遍历主流的浏览器,一般情况是可以的,不需要完整路径,可以打开。如果打不开,就使用默认浏览器打开,我直接用window shell 打开的,这种比较通用,为什么不用explorer打开一个浏览器,因为他多开一个explorer,这样子感觉体验不是那么好。