【问题标题】:How to open in default browser in C#C#如何在默认浏览器中打开
【发布时间】:2011-06-02 14:09:09
【问题描述】:

我正在设计一个小型 C# 应用程序,其中有一个 Web 浏览器。我目前在我的计算机上有我所有的默认设置,说谷歌浏览器是我的默认浏览器,但是当我单击我的应用程序中的链接以在新窗口中打开时,它会打开 Internet Explorer。有没有办法让这些链接在默认浏览器中打开?还是我的电脑有问题?

我的问题是我的应用程序中有一个网络浏览器,所以假设你去谷歌并输入“堆栈溢出”并右键单击第一个链接并单击“在新窗口中打开”它在 IE 而不是 Chrome 中打开。这是我编码不正确,还是我的计算机上的设置不正确

===编辑===

这真的很烦人。我已经知道浏览器是 IE,但我之前运行良好。当我单击一个链接时,它会在 chrome 中打开。我当时正在使用sharp development制作应用程序,因为我无法启动c# express。我做了一个全新的 Windows 安装,因为我在我的应用程序中并没有走得太远,所以我决定重新开始,现在我遇到了这个问题。这就是为什么我不确定它是否是我的电脑。为什么点击链接时 IE 会启动整个浏览器,而不是简单地在默认浏览器中打开新链接?

【问题讨论】:

  • 呵呵,说服 IE 为您打开 Chrome 将是一场艰苦的战斗。好吧,一点也不。如果您直接运行 IE,这也不起作用。或者如果 IE 是默认的,那么 Chrome 也是如此。
  • @SLaks Mono?你在说什么?
  • 1) getstartMenuDir 搜索 Firefox 或 Chrome StandartName 确保。如果没有找到。 2)获取曾经存在的标准安装位置列表 32 64 chrome ff 使用它。如果不是 3) 最后的手段使用答案。

标签: c# browser window default new-operator


【解决方案1】:

你可以写

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

编辑WebBrowser 控件是 IE 的嵌入副本。
因此,其中的任何链接都会在 IE 中打开。

要更改此行为,您可以处理Navigating 事件。

【讨论】:

  • 试试看。使用Taskmgr.exe,您会看到两个 的iexporer.exe 副本正在运行。进程外的导航不会触发。
  • @Sean:是的。 Process.Start(e.Url.ToString())
  • 本地 url (file:///) 不适用于查询字符串,除非将浏览器 exe 指定为第一个参数。
  • 请注意,此 can 方法也可能引入安全问题,因为如果将“url”替换为应用程序的物理路径,它也会执行
  • 不适用于 .NET Core。接受的答案应该支持 .NET Core,请参阅下面 Mayank Tripathi 的答案。
【解决方案2】:

对于那些在 dotnet core 中发现这个问题的人。我找到了解决方案here

代码:

private void OpenUrl(string url)
{
    try
    {
        Process.Start(url);
    }
    catch
    {
        // hack because of this: https://github.com/dotnet/corefx/issues/10361
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            url = url.Replace("&", "^&");
            Process.Start(new ProcessStartInfo(url) { UseShellExecute = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            Process.Start("xdg-open", url);
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            Process.Start("open", url);
        }
        else
        {
            throw;
        }
    }
}

【讨论】:

  • 我认为不是...我的解决方案是一种替代方案。
  • 绝妙的解决方案。忽略上面的m0ngoloids。
  • 这应该是最佳答案,因为它的原始版本已经过时并且仅在 Windows 上仍然相关。
  • 优秀的答案乔尔。在 Windows 和 VS 2019 WPF(.NET Core) 应用程序上也为我工作。我想知道如何在定义的浏览器上打开 URL。具体来说,仅从 Microsoft Edge 打开 URL。我应该对你的代码 sn-p 做哪些更改?
  • 在某些阻止运行 cmd.exe 的公司环境中,这将在 Windows 上失败。
【解决方案3】:
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

应该可以解决你的问题

【讨论】:

  • 应该是'static void GotoSite'
  • 就我而言,它仅在我以提升的权限运行 Windows 应用程序时才有效。我在 Windows 10 上使用 excel WPF 应用程序,Chrome 作为默认浏览器。知道如何解决这个问题,这样我就不必以提升的权限运行?
【解决方案4】:

经过大量研究,我觉得大多数给定的答案都不适用于 dotnet core。 1.System.Diagnostics.Process.Start("http://google.com"); -- 不适用于 dotnet core

2.它会工作,但如果默认浏览器是chrome,它会阻止新窗口打开

 myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();

以下是最简单的,适用于所有场景。

Process.Start("explorer", url);

【讨论】:

  • 在控制台应用程序 .Net Core 3.1 中工作
  • 我也无法让System.Diagnostics.Process.Start("http://google.com") 在 WinUI 3 中工作。但是,我能够让这个解决方案工作。此外,Windows.System.Launcher.LaunchUriAsync(new Uri("http://google.com")); 有效。
【解决方案5】:

你试过Process这里提到的http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx吗?

你可以使用

Process myProcess = new Process();

try
{
    // true is the default, but it is important not to set it to false
    myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

【讨论】:

  • UseShellExecute 默认为 true。
  • @SLaks,谢谢。另一方面,重要的是要提到它必须是true
  • 对于那些懒得检查...进程需要“使用 System.Diagnostics”
  • 这似乎是 WPF 需要的路由。如果你只是做Process.Start(url),它不会打开一个新的浏览器窗口。
  • 请注意 - .NET Core 不再默认 UseShellExecute 为 true,因此需要该行。
【解决方案6】:

我的默认浏览器是谷歌浏览器,接受的答案是以下错误:

系统找不到指定的文件。

我解决了这个问题,并设法使用以下代码使用默认浏览器打开了一个 URL:

System.Diagnostics.Process.Start("explorer.exe", "http://google.com");

【讨论】:

  • 最佳答案确实没有用,谢谢。
【解决方案7】:

我在 Windows 上的 .NET 5 和 Windows 窗体中使用它。它甚至适用于其他默认浏览器(例如 Firefox):

Process.Start(new ProcessStartInfo { FileName = url, UseShellExecute = true });

基于thisthis

【讨论】:

    【解决方案8】:

    试试这个,老派的方式;)

    public static void openit(string x)
        {
            System.Diagnostics.Process.Start("cmd", "/C start" + " " + x);
        }
    

    使用:openit("www.google.com");

    【讨论】:

    • 这不能被利用吗,唉,“Shellsock”?
    • @JosephLennox 这是一个很好的观点!可能值得一提的是,直接在 URL 上的 System.Diagnostics.Process.Start 并不安全(任何?)!另一方面,如果用户在他们的计算机上运行您的应用程序(他们可能是),他们能做的最糟糕的事情就是破坏他们自己的系统:P
    • @Ben 取决于输入的来源。如果它是共享数据源,一旦用户输入恶意命令,所有其他点击“Go”的用户都将任由该用户摆布。
    【解决方案9】:

    看看GeckoFX control

    GeckoFX 是一个开源组件 这使得嵌入 Mozilla 变得容易 Gecko (Firefox) 进入任何 .NET Windows 表格申请。写得很干净, 完全注释 C#,GeckoFX 是 完美替代默认值 基于 Internet Explorer 的 WebBrowser 控制。

    【讨论】:

    • 我的问题是我的应用程序中有一个网络浏览器,所以假设你去谷歌输入“堆栈溢出”并右键单击第一个链接并单击“在新窗口中打开”它打开IE而不是Chrome。这是我编码不正确,还是我的计算机上的设置不正确
    • @SLaks:你为什么这么说?我不相信编写一个字符串并将其设置为 GetDefaultBrowserPath() 并不困难。
    • @Sean:如果您的应用程序中有网络浏览器,那么默认情况下它将使用 IE。导航事件可以帮助您解决这个问题。
    • 在意识到 OP 不希望更改由单独进程启动的默认浏览器后,我修改了答案。
    【解决方案10】:

    只有我一个人太害怕在我刚从互联网上读到的字符串上打电话给System.Diagnostics.Process.Start()吗?

            public bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
            {
                Request = request;
                string url = Request.Url;
                
                if (Request.TransitionType != TransitionType.LinkClicked)
                {   // We are only changing the behavoir when someone clicks on a link.
                    // Let the embedded browser handle this request itself.
                    return false;
                }
                else
                {   // The user clicked on a link.  Something like a filter icon, which links to the help for that filter.
                    // We open a new window for that request.  This window cannot change.  It is running a JavaScript
                    // application that is talking with the C# main program.
                    Uri uri = new Uri(url);
                    try
                    {
                        switch (uri.Scheme)
                        {
                            case "http":
                            case "https":
                                {   // Stack overflow says that this next line is *the* way to open a URL in the
                                    // default browser.  I don't trust it.  Seems like a potential security
                                    // flaw to read a string from the network then run it from the shell.  This
                                    // way I'm at least verifying that it is an http request and will start a
                                    // browser.  The Uri object will also verify and sanitize the URL.
                                    System.Diagnostics.Process.Start(uri.ToString());
                                    break;
                                }
                            case "showdevtools":
                                {
                                    WebBrowser.ShowDevTools();
                                    break;
                                }
                        }
                    }
                    catch { }
                    // Tell the browser to cancel the navigation.
                    return true;
                }
            }
    

    此代码旨在与 CefSharp 一起使用,但应该很容易适应。

    【讨论】:

      【解决方案11】:

      如果我们使用Process.Start(URL)dotnet core 会抛出错误。以下代码将在dotnet core 中工作。您可以添加任何浏览器而不是 Chrome

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

      【讨论】:

      • 不是Q的答案,代码不知道默认浏览器是什么
      • 看起来用户需要已经打开 Chrome 才能使用它。
      【解决方案12】:

      这为我打开了默认值:

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

      【讨论】:

      • 您正在使用的包是否为 EventArgs 提供了 LinkText 的属性?
      【解决方案13】:

      在 UWP 中:

      await Launcher.LaunchUriAsync(new Uri("http://google.com"));
      

      【讨论】:

      • 这是Launcher.LaunchUriAsync。按照链接获取完整示例。有趣的是,返回值允许调用者知道 URL 是否被打开。请注意,这适用于 Windows 8/Server2012/Phone8 及更高版本。如果软件必须与旧版本兼容,则不能使用。
      【解决方案14】:

      我试过了

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

      这适用于大多数情况,但我遇到了一个问题,其 url 指向一个文件:

      系统找不到指定的文件。

      所以,我尝试了this solution,它正在稍作修改:

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

      在不使用 "" 包装 url 的情况下,资源管理器会打开您的文档文件夹。

      【讨论】:

      • 所以基本上你的答案是评论或至少是重复的
      • @Vega 对不起,我没有足够的声誉来添加评论...我添加了这个答案,因为这个帖子中没有提到这个修改。
      • 这(最终)为我修复了 .Net Core 上的“找不到文件”错误
      【解决方案15】:

      动态打开

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

      【讨论】:

        【解决方案16】:

        使用当前版本的资源管理器更新注册表
        @"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);
        

        【讨论】:

          【解决方案17】:

          这适用于 .NET 5 (Windows):

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

          【讨论】:

          • 这确实很好用,但不只是对用户来说——它可以用来执行恶意代码,因为你创建了一个 cmd.exe 进程并向它传递参数
          【解决方案18】:

          修复 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);
              }
          }
          

          【讨论】:

            【解决方案19】:

            我会评论上述答案之一,但我还没有代表。

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

            几乎 可以工作,除非 url 有查询字符串,在这种情况下,这段代码只会打开一个文件资源管理器窗口。关键似乎确实是 UseShellExecute 标志,正如上面 Alex Vang 的回答中所给出的(模其他 cmets 关于在网络浏览器中启动随机字符串)。

            【讨论】:

              【解决方案20】:

              您可以在默认浏览器中使用 cmd 命令start <link> 打开链接,此方法适用于所有具有在 cmd.exe 上执行系统命令功能的语言。

              这是我用于 .NET 6 执行系统命令并重定向输出和输入的方法,也很确定它可以在 .NET 5 上进行一些修改。

              using System.Diagnostics.Process cmd = new();
              cmd.StartInfo.FileName = "cmd.exe";
              cmd.StartInfo.RedirectStandardInput = true;
              cmd.StartInfo.RedirectStandardOutput = true;
              cmd.StartInfo.CreateNoWindow = true;
              cmd.StartInfo.UseShellExecute = false;
              cmd.Start();
              
              
              cmd.StandardInput.WriteLine("start https://google.com"); 
              cmd.StandardInput.Flush();
              cmd.StandardInput.Close();
              cmd.WaitForExit();
              

              【讨论】:

                猜你喜欢
                • 2011-07-01
                • 2018-03-18
                • 2011-05-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-05-02
                • 2010-09-14
                相关资源
                最近更新 更多