How to open in default browser in C#
Asked Answered
S

21

372

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?

Subjectify answered 2/1, 2011 at 20:10 Comment(2)
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.Vomit
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.Floury
O
623

On the .NET Framework (not on .Net Core or net50+), 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.

Outfight answered 2/1, 2011 at 20:19 Comment(15)
Try it. Use Taskmgr.exe, you'll see two copies of iexporer.exe running. Navigating doesn't fire for the out-of-process one.Vomit
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.Outfight
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?Subjectify
@Sean: Yes. Process.Start(e.Url.ToString())Outfight
Is there any way you can get it to also bring the new browser window to the foreground?Scissor
@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.Epithalamium
Local url (file:///) doesn't work with a querystring unless browser exe is specified as first param.Carpal
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 executeSplashdown
@GerriePretorius, is there a more secure method to accomplish this?Artemisa
@Spencer: Make sure the URL is trusted.Outfight
@Artemisa 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.Splashdown
Does not work with .NET Core. The accepted answer should support .NET Core, see Mayank Tripathi's answer below.Apologete
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?Analcite
This will not open default browser, don't follow this answer.Uncouple
Gives an exception "The system cannot find the file specified"Chor
F
172

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;
        }
    }
}
Ferro answered 5/4, 2017 at 13:20 Comment(13)
Thanks! works for me ... but in macos with open command instead of xdg-openCardinal
@Equiman doesnt it do that? RuntimeInformation.IsOSPlatform(OSPlatform.OSX) or will it already be true at Linux?Ferro
I did it. But xdg-command returns "xdg-open: command not found". Then I tested with open command and works.Cardinal
@Equiman so you are saying i should switch elseif linux and OSX around to make it work or does macos not fall udner OSX?Ferro
I think not... my solution is kind an alternative.Cardinal
For Windows, I recommend Process.Start(new ProcessStartInfo { FileName = url, UseShellExecute = true });Eusebiaeusebio
This should be the top answer, as it the original is outdated and is only still relevant on Windows.Sisterinlaw
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?Azpurua
This will fail on Windows in some corporate environments where running cmd.exe is prevented.Sneer
Curious, why this line? url = url.Replace("&", "^&");Derward
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 issueStreetlight
This is working fine. Is there any way to capture the pagesource and return it to the c# application? I cannot use HttpClient method coz web owner is preventing it. But URL is working fine on web browser.Skaggs
@PrageethLiyanage (verify if this is LEGAL in your case!) you could just imitate being a browser by sending the right Headers (names and values, often the User Agent). Although i'm not sure this is LEGAL in all countries.Ferro
M
64

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);
Meshach answered 6/5, 2020 at 7:35 Comment(5)
Works in Console app .Net Core 3.1Interstellar
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.Mackle
Actually this one will not work in all scenarios. It does not work with URLs with query strings, for instance. Try Process.Start("explorer", "https://google.com/search?q=C#"); and Windows will display your Documents folder.Medina
@MustafaÖzçetin - Maybe query string needs to encode # as %23? "https://google.com/search?q=C%23".Mohican
@ToolmakerSteve: Tried yours but no difference. I tried with .NET Framework 4.7.2 and .NET 5 and both gives the same result.Medina
T
44
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

that should solve your problem

Tunnell answered 25/4, 2013 at 2:4 Comment(2)
should be 'static void GotoSite'Yann
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?Analcite
I
37

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);
}
Incorporation answered 2/1, 2011 at 20:19 Comment(7)
UseShellExecute defaults to true.Outfight
@SLaks, thanks. On the other hand it is important to mention that it has to be true.Incorporation
For those too lazy to check...Process requires "using System.Diagnostics"Tetraploid
This seems to be the route required by WPF. If you just do Process.Start(url), it doesn't open a new browser window.Trifid
Just to note - .NET Core no longer defaults UseShellExecute to true, so that line is required.Riojas
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?Analcite
As a complementary to @MikeMarynowski the docs says that the default value of the ProcessStartInfo.UseShellExecute property is false with .NET Core and onward (5+).Medina
M
26

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");
Mogilev answered 1/7, 2020 at 13:30 Comment(1)
On Windows that is the correct answer, cause without the "explorer.exe" argument Windows allways asks which of the installed browsers it should use.Aurangzeb
F
22

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.

Fastness answered 5/2, 2021 at 16:13 Comment(0)
L
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");

Livi answered 28/1, 2015 at 4:37 Comment(3)
Can't this be exploited, ala, "Shellsock" ?Nickelson
@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 :PConvalescence
@Convalescence 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.Ardyce
U
8

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.

Underhanded answered 12/7, 2021 at 16:52 Comment(0)
T
4

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.

Transmigrant answered 2/1, 2011 at 20:15 Comment(4)
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 computerSubjectify
@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().Transmigrant
@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.Transmigrant
I have modified my answer after realizing that OP does not wish to change the default browser launched by a separate process.Transmigrant
W
3

This opened the default for me:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Wulfila answered 21/4, 2015 at 8:2 Comment(1)
Is there a package that you are using that gives EventArgs the property of LinkText?Tetraploid
N
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.

Neoteny answered 4/6, 2021 at 13:28 Comment(4)
So basically your answer is a comment or at least a duplicateZipporah
@Zipporah Sorry, I didn't have enough reputation to add a comment ... I added this answer because this modification is not mentioned in this thread.Neoteny
This (finally) fixed the "cannot find the file" bug for me on .Net CoreRufus
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, tooSmothers
V
3

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 });
Vachel answered 10/7, 2023 at 20:4 Comment(1)
Duplicate of https://mcmap.net/q/92212/-how-to-open-in-default-browser-in-cMohican
F
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);
Fimbriate answered 8/4, 2019 at 11:31 Comment(2)
Not an answer to the Q, it is not known to the code what the default browser isOkay
It looks like the user needs to have Chrome already open for this to work.Presentation
S
1

In UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Saundra answered 29/11, 2016 at 14:14 Comment(1)
This is Launcher.LaunchUriAsync. 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.Hollingshead
S
0

Open dynamically

string addres= "Print/" + Id + ".htm";
           System.Diagnostics.Process.Start(Path.Combine(Environment.CurrentDirectory, addres));
Skirting answered 22/2, 2018 at 6:58 Comment(0)
C
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);
Cassaba answered 8/8, 2018 at 6:9 Comment(0)
H
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);
Hydrocellulose answered 9/7, 2021 at 11:5 Comment(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 itPetrolic
B
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);
    }
}
Bolling answered 5/9, 2021 at 8:8 Comment(0)
B
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).

Bohrer answered 27/10, 2021 at 0:35 Comment(0)
L
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();
Lynettalynette answered 9/11, 2021 at 13:33 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.