c# 打开浏览器商用代码

一,背景

这个需求看起来不复杂,但考虑通用话比较麻烦,一些用户还是用的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,这样子感觉体验不是那么好。