none
C#中调用系统默认浏览器打开url的最好方法是什么? RRS feed

  • 问题

  • 我一般用:

    System.Diagnostics.Process.Start("url");

    但是,这个做法经常在某些用户的电脑上出问题,例如点了没有任何反应,或者报错说“找不到应用程序”。

    然而实际上这些用户的浏览器都是好好的,可以正常使用。所以用户会觉得是我们程序的问题。

    请问有什么更加稳定的做法吗?


    da jia hao!

    2017年9月15日 9:20

答案


  • Hi liubin,

    也许你客户电脑上的所有默认浏览器程序都是不相同的。

    你可以尝试使用下面的代码查找用户默认的浏览器,然后对应程序打开网页。

               string browserName = "iexplore.exe";
                object progIdValue = GetDefaultBrowserPath();
                if (progIdValue != null)
                {
                    if (progIdValue.ToString().ToLower().Contains("chrome"))
                        browserName = "chrome.exe";
                    else if (progIdValue.ToString().ToLower().Contains("firefox"))
                        browserName = "firefox.exe";
                    else if (progIdValue.ToString().ToLower().Contains("safari"))
                        browserName = "safari.exe";
                    else if (progIdValue.ToString().ToLower().Contains("opera"))
                        browserName = "opera.exe";
                }
                Process.Start(new ProcessStartInfo(browserName, "www.google.com"));
    
            public static string GetDefaultBrowserPath()
            {
                string defaultBrowserPath = null;
                RegistryKey regkey;
    
                // Check if we are on Vista or Higher
                OperatingSystem OS = Environment.OSVersion;
                if ((OS.Platform == PlatformID.Win32NT) && (OS.Version.Major >= 6))
                {
                    regkey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\shell\\Associations\\UrlAssociations\\http\\UserChoice", false);
                    if (regkey != null)
                    {
                        defaultBrowserPath = regkey.GetValue("Progid").ToString();
                    }
                    else
                    {
                        regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Classes\\IE.HTTP\\shell\\open\\command", false);
                        defaultBrowserPath = regkey.GetValue("").ToString();
                    }
                }
                else
                {
                    regkey = Registry.ClassesRoot.OpenSubKey("http\\shell\\open\\command", false);
                    defaultBrowserPath = regkey.GetValue("").ToString();
                }
    
                return defaultBrowserPath;
            }

    Best Regards,

    Yohann Lu



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 liubin 2017年9月20日 9:10
    2017年9月18日 5:42
    版主

全部回复

  • 有几个方法可参考,参见这里

    https://www.mindstick.com/Articles/628/process-start-in-c-sharp-with-examples

    1  加参数ProcessStartInfo

    2  加run as administrator

    Verb = "runas",


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年9月18日 0:43

  • Hi liubin,

    也许你客户电脑上的所有默认浏览器程序都是不相同的。

    你可以尝试使用下面的代码查找用户默认的浏览器,然后对应程序打开网页。

               string browserName = "iexplore.exe";
                object progIdValue = GetDefaultBrowserPath();
                if (progIdValue != null)
                {
                    if (progIdValue.ToString().ToLower().Contains("chrome"))
                        browserName = "chrome.exe";
                    else if (progIdValue.ToString().ToLower().Contains("firefox"))
                        browserName = "firefox.exe";
                    else if (progIdValue.ToString().ToLower().Contains("safari"))
                        browserName = "safari.exe";
                    else if (progIdValue.ToString().ToLower().Contains("opera"))
                        browserName = "opera.exe";
                }
                Process.Start(new ProcessStartInfo(browserName, "www.google.com"));
    
            public static string GetDefaultBrowserPath()
            {
                string defaultBrowserPath = null;
                RegistryKey regkey;
    
                // Check if we are on Vista or Higher
                OperatingSystem OS = Environment.OSVersion;
                if ((OS.Platform == PlatformID.Win32NT) && (OS.Version.Major >= 6))
                {
                    regkey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\shell\\Associations\\UrlAssociations\\http\\UserChoice", false);
                    if (regkey != null)
                    {
                        defaultBrowserPath = regkey.GetValue("Progid").ToString();
                    }
                    else
                    {
                        regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Classes\\IE.HTTP\\shell\\open\\command", false);
                        defaultBrowserPath = regkey.GetValue("").ToString();
                    }
                }
                else
                {
                    regkey = Registry.ClassesRoot.OpenSubKey("http\\shell\\open\\command", false);
                    defaultBrowserPath = regkey.GetValue("").ToString();
                }
    
                return defaultBrowserPath;
            }

    Best Regards,

    Yohann Lu



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 liubin 2017年9月20日 9:10
    2017年9月18日 5:42
    版主
  • 这个有用!实际遇到的问题就是用户安装了各种各样的浏览器,这些浏览器往往都去修改系统默认浏览器设置,最终结果就是导致系统错乱,提示你“找不到应用程序”。。。。

    da jia hao!

    2017年9月20日 9:10