361

I am designing a small C# application and there is a web browser in it. I currently have all of my defaults on my computer say google chrome is my default browser, yet when I click a link in my application to open in a new window, it opens internet explorer. Is there any way to make these links open in the default browser instead? Or is there something wrong on my computer?

My problem is that I have a webbrowser in the application, so say you go to google and type in "stack overflow" and right click the first link and click "Open in new window" it opens in IE instead of Chrome. Is this something I have coded improperly, or is there a setting not correct on my computer

===EDIT===

This is really annoying. I am already aware that the browser is IE, but I had it working fine before. When I clicked a link it opened in chrome. I was using sharp develop to make the application at that time because I could not get c# express to start up. I did a fresh windows install and since I wasn't too far along in my application, I decided to start over, and now I am having this problem. That is why I am not sure if it is my computer or not. Why would IE start up the whole browser when a link is clicked rather than simply opening the new link in the default browser?

Sean
  • 8,401
  • 15
  • 40
  • 48
  • Hehe, convincing IE to open Chrome for you is going to be a bit of an uphill battle. Well, not a bit. This doesn't work either if you run IE directly. Or Chrome for that matter if IE is the default. – Hans Passant Jan 02 '11 at 21:23
  • 1) getstartMenuDir Search For Firefox or Chrome StandartName Besure. if not found. 2) get list of standard install locations which ever exist 32 64 chrome ff use that. if not 3) last resort use the answers. – bh_earth0 Aug 30 '18 at 09:34

21 Answers21

614

You can just write

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

EDIT: The WebBrowser control is an embedded copy of IE.
Therefore, any links inside of it will open in IE.

To change this behavior, you can handle the Navigating event.

jheriko
  • 3,043
  • 1
  • 21
  • 28
SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
  • 2
    Try it. Use Taskmgr.exe, you'll see *two* copies of iexporer.exe running. Navigating doesn't fire for the out-of-process one. – Hans Passant Jan 02 '11 at 21:37
  • Huh? `Navigating` should fire for links in the WebBrowser. I never meant to say that you can control links in the new window; I meant to you can handle `Navigating` to suppress the new window and call `Process.Start`. – SLaks Jan 02 '11 at 21:39
  • What do you mean that I can suppress the new window and call a process start? Is there a way to get the url of the page that is supposed to open up before IE opens it, then tell the default browser to open it? – Sean Jan 03 '11 at 03:39
  • 5
    @Sean: Yes. `Process.Start(e.Url.ToString())` – SLaks Jan 03 '11 at 03:54
  • Is there any way you can get it to also bring the new browser window to the foreground? – Sam Harwell Jul 02 '14 at 13:34
  • @Slaks, is it possible to use the navigating event to prevent opening a new window? I've seen some examples on the web and I have not been able to get anything to work. Some help here is greatly appreciated. Cheers. – IbrarMumtaz Jan 22 '15 at 16:05
  • 3
    Local url (file:///) doesn't work with a querystring unless browser exe is specified as first param. – HerrimanCoder Sep 20 '16 at 21:14
  • 7
    Be aware that this can method can also introduce a security issue, since, if the "url" is replaced with a physical path to an application it will also execute – Gerrie Pretorius Jul 18 '17 at 06:46
  • @GerriePretorius, is there a more secure method to accomplish this? – Spencer Jan 28 '19 at 22:00
  • 1
    @Spencer: Make sure the URL is trusted. – SLaks Jan 29 '19 at 02:37
  • @Spencer as SLaks pointed out, just make sure you sanitize the URL to make sure it is actually a web address and not a physical path. – Gerrie Pretorius Jan 30 '19 at 13:11
  • 26
    Does not work with .NET Core. The accepted answer should support .NET Core, see Mayank Tripathi's answer below. – Andi Sep 17 '20 at 11:15
  • In my case it only works when I run the windows app with elevated permissions. I am using excel WPF application on windows 10 with Chrome as the default browser. Any idea how this can be fixed so I don't have to run with elevated permissions? – Gagan May 06 '21 at 20:40
  • 1
    This will not open default browser, don't follow this answer. – Ray Sep 15 '21 at 02:17
  • Gives an exception "The system cannot find the file specified" – Paul McCarthy May 12 '22 at 14:18
152

For those finding this question in dotnet core. I found a solution here

Code:

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;
        }
    }
}
user555
  • 1,564
  • 2
  • 15
  • 29
Joel Harkes
  • 10,975
  • 3
  • 46
  • 65
  • Thanks! works for me ... but in macos with `open` command instead of `xdg-open` – equiman Oct 26 '17 at 15:32
  • @Equiman doesnt it do that? `RuntimeInformation.IsOSPlatform(OSPlatform.OSX)` or will it already be true at Linux? – Joel Harkes Oct 26 '17 at 15:34
  • I did it. But `xdg-command` returns "xdg-open: command not found". Then I tested with `open` command and works. – equiman Oct 26 '17 at 16:03
  • @Equiman so you are saying i should switch elseif linux and OSX around to make it work or does macos not fall udner OSX? – Joel Harkes Oct 27 '17 at 06:50
  • 1
    I think not... my solution is kind an alternative. – equiman Oct 27 '17 at 13:03
  • 4
    For Windows, I recommend `Process.Start(new ProcessStartInfo { FileName = url, UseShellExecute = true });` – Matt Jenkins Apr 12 '20 at 10:14
  • 1
    This should be the top answer, as it the original is outdated and is only still relevant on Windows. – ForeverZer0 Sep 07 '20 at 05:54
  • 1
    Excellent answer Joel. Also worked for me on Windows and VS 2019 WPF(.NET Core) application. I would like to know how to open the URL on a defined browser. Specifically, open the URL only from Microsoft Edge. What changes shall I do in your code snippet? – NikSp Oct 13 '20 at 21:30
  • 1
    This will fail on Windows in some corporate environments where running `cmd.exe` is prevented. – user555 Feb 09 '22 at 16:10
  • Curious, why this line? url = url.Replace("&", "^&"); – Greg Bishop Feb 22 '22 at 21:05
  • Opening files with default viewers started giving errors when i tested my application on Windows 11. It was perfectly opening files on Windows 10. Using ProcessInfo.UseShellExecute = true fixed the issue – Syed Irfan Ahmad Oct 19 '22 at 09:15
57

After researching a lot I feel most of the given answer will not work with dotnet core. 1.System.Diagnostics.Process.Start("http://google.com"); -- Will not work with dotnet core

2.It will work but it will block the new window opening in case default browser is chrome

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

Below is the simplest and will work in all the scenarios.

Process.Start("explorer", url);
Mayank Tripathi
  • 809
  • 1
  • 7
  • 11
  • Works in Console app .Net Core 3.1 – Kozbara Sep 30 '21 at 18:59
  • I also could not get `System.Diagnostics.Process.Start("http://google.com")` to work in WinUI 3. I was able to get this solution to work, however. Additionally, `Windows.System.Launcher.LaunchUriAsync(new Uri("http://google.com"));` works. – Michael Kintscher they-them Jan 25 '22 at 19:33
44
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

that should solve your problem

yossico
  • 3,421
  • 5
  • 41
  • 76
user2193090
  • 465
  • 4
  • 2
  • 7
    should be 'static void GotoSite' – Behrooz Jul 15 '15 at 10:15
  • In my case it only works when I run the windows app with elevated permissions. I am using excel WPF application on windows 10 with Chrome as the default browser. Any idea how this can be fixed so I don't have to run with elevated permissions? – Gagan May 06 '21 at 20:46
36

Did you try Processas mentioned here: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx?

You could use

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);
}
Andreas
  • 3,929
  • 2
  • 25
  • 22
  • 1
    `UseShellExecute` defaults to true. – SLaks Jan 02 '11 at 20:20
  • 4
    @SLaks, thanks. On the other hand it is important to mention that it has to be `true`. – Andreas Jan 02 '11 at 20:22
  • 1
    For those too lazy to check...Process requires "using System.Diagnostics" – Nick Roberts Sep 27 '16 at 15:27
  • 1
    This seems to be the route required by WPF. If you just do `Process.Start(url)`, it doesn't open a new browser window. – Scott Salyer Oct 16 '19 at 13:45
  • 11
    Just to note - .NET Core no longer defaults `UseShellExecute` to true, so that line is required. – Mike Marynowski Nov 07 '20 at 14:28
  • In my case it only works when I run the windows app with elevated permissions. I am using excel WPF application on windows 10 with Chrome as the default browser. Any idea how this can be fixed so I don't have to run with elevated permissions? – Gagan May 06 '21 at 20:41
23

My default browser is Google Chrome and the accepted answer is giving the following error:

The system cannot find the file specified.

I solved the problem and managed to open an URL with the default browser by using this code:

System.Diagnostics.Process.Start("explorer.exe", "http://google.com");
EstevaoLuis
  • 2,422
  • 7
  • 33
  • 40
16

I'm using this in .NET 5, on Windows, with Windows Forms. It works even with other default browsers (such as Firefox):

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

Based on this and this.

TechAurelian
  • 5,561
  • 5
  • 50
  • 65
8

Try this , old school way ;)

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

using : openit("www.google.com");

AbcAeffchen
  • 14,400
  • 15
  • 47
  • 66
mohkirkuk
  • 127
  • 1
  • 3
  • 4
    Can't this be exploited, ala, "Shellsock" ? – Joseph Lennox Feb 11 '15 at 20:48
  • 1
    @JosephLennox that's an excellent point! it's probably worth mentioning that System.Diagnostics.Process.Start on the URL directly isn't much (any?) safer! on the other hand, if the user is running your application on THEIR computer (they probably are), the worst they can do is break their own system :P – Ben Jun 05 '15 at 21:25
  • 4
    @Ben Depends where the input is coming from. If it's a shared data source, once user could enter a malicious command and all other users who click "Go" would be at that user's mercy. – Dan Bechard Mar 17 '16 at 20:15
7

Am I the only one too scared to call System.Diagnostics.Process.Start() on a string I just read off the internet?

        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;
            }
        }

This code was designed to work with CefSharp, but should be easy to adapt.

Trade-Ideas Philip
  • 1,067
  • 12
  • 21
5

Take a look at the GeckoFX control.

GeckoFX is an open-source component which makes it easy to embed Mozilla Gecko (Firefox) into any .NET Windows Forms application. Written in clean, fully commented C#, GeckoFX is the perfect replacement for the default Internet Explorer-based WebBrowser control.

THE DOCTOR
  • 4,399
  • 10
  • 43
  • 64
  • My problem is that I have a webbrowser in the application, so say you go to google and type in "stack overflow" and right click the first link and click "Open in new window" it opens in IE instead of Chrome. Is this something I have coded improperly, or is there a setting not correct on my computer – Sean Jan 02 '11 at 20:20
  • @SLaks: Why do you say that? I don't believe it is at all difficult to write create a string and set it equal to GetDefaultBrowserPath(). – THE DOCTOR Jan 02 '11 at 20:24
  • @Sean: If you have a webbrowser within your application then it is going to use IE by default. The Navigating event can help you get around that. – THE DOCTOR Jan 02 '11 at 20:28
  • I have modified my answer after realizing that OP does not wish to change the default browser launched by a separate process. – THE DOCTOR Jan 02 '11 at 20:40
3

This opened the default for me:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Xero Phane
  • 88
  • 8
3

I tried

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

which works for most of the cases but I run into an issue having a url which points to a file:

The system cannot find the file specified.

So, I tried this solution, which is working with a little modification:

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

Without wrapping the url with "", the explorer opens your document folder.

  • So basically your answer is a comment or at least a duplicate – Vega Jul 03 '21 at 14:53
  • @Vega Sorry, I didn't have enough reputation to add a comment ... I added this answer because this modification is not mentioned in this thread. – Code A Software Jul 04 '21 at 10:20
  • 2
    This (finally) fixed the "cannot find the file" bug for me on .Net Core – gjvdkamp Aug 09 '21 at 12:34
  • 1
    The solution without the quotes worked for me until I had a URL with a query string, which opened the document folder. This solution works for query string URLs, too – h3n Mar 08 '23 at 20:41
2

dotnet core throws an error if we use Process.Start(URL). The following code will work in dotnet core. You can add any browser instead of Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);
Natarajan Ganapathi
  • 551
  • 1
  • 7
  • 19
1

In UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Kibernetik
  • 2,947
  • 28
  • 35
  • This is [Launcher.LaunchUriAsync](https://msdn.microsoft.com/library/windows/apps/windows.system.launcher.launchuriasync.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1). Follow link for complete example. Interestingly, the return value allows caller to know if URL was opened or not. Beware, this is for Windows 8/Server2012/Phone8 and above. If the software has to be compatible with older versions, it can't use that. – Stéphane Gourichon Jan 06 '17 at 13:06
1

Already best given answer imho:

For Windows, I recommend Process.Start(new ProcessStartInfo { FileName = url, UseShellExecute = true }); – Matt Jenkins Apr 12, 2020 at 10:14

Updated to MS recommandation from 2023 found on https://learn.microsoft.com/en-us/troubleshoot/developer/visualstudio/csharp/language-compilers/start-internet-browser

System.Diagnostics.Process.Start(new ProcessStartInfo { FileName = "https://stackoverflow.com/", UseShellExecute = true });
Adalyat Nazirov
  • 1,611
  • 2
  • 14
  • 28
GillBates
  • 11
  • 1
0

Open dynamically

string addres= "Print/" + Id + ".htm";
           System.Diagnostics.Process.Start(Path.Combine(Environment.CurrentDirectory, addres));
mirazimi
  • 814
  • 10
  • 11
0

update the registry with current version of explorer
@"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);
dfgv
  • 101
  • 1
  • 12
0

This works nicely for .NET 5 (Windows):

 ProcessStartInfo psi = new ProcessStartInfo {
   FileName = "cmd.exe",
     Arguments = $ "/C start https://stackoverflow.com/",
     WindowStyle = ProcessWindowStyle.Hidden,
     CreateNoWindow = true
 };
 Process.Start(psi);
Kye
  • 76
  • 1
  • 10
  • 1
    This indeed works nicely, but not just for the user - it can be used to execute malicious code since you create an cmd.exe process and pass arguments to it – fyb Aug 08 '21 at 11:12
0

to fix problem with Net 6 i used this code from ChromeLauncher ,default browser will be like it

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);
    }
}
hossein sedighian
  • 1,711
  • 1
  • 13
  • 16
0

I'd comment on one of the above answers, but I don't yet have the rep.

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

nearly works, unless the url has a query-string, in which case this code just opens a file explorer window. The key does seem to be the UseShellExecute flag, as given in Alex Vang's answer above (modulo other comments about launching random strings in web browsers).

0

You can open a link in default browser using cmd command start <link>, this method works for every language that has a function to execute a system command on cmd.exe.

This is the method I use for .NET 6 to execute a system command with redirecting the output & input, also pretty sure it will work on .NET 5 with some modifications.

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();
Felierix
  • 179
  • 3
  • 12