Cómo abrir en el navegador predeterminado en C #

258

Estoy diseñando una pequeña aplicación C # y hay un navegador web en ella. Actualmente tengo todos mis valores predeterminados en mi computadora, dicen que Google Chrome es mi navegador predeterminado, pero cuando hago clic en un enlace en mi aplicación para abrir en una nueva ventana, se abre Internet Explorer. ¿Hay alguna forma de hacer que estos enlaces se abran en el navegador predeterminado? ¿O hay algo mal en mi computadora?

Mi problema es que tengo un navegador web en la aplicación, así que digamos que vaya a google y escriba "desbordamiento de pila" y haga clic derecho en el primer enlace y haga clic en "Abrir en una nueva ventana" se abre en IE en lugar de Chrome. ¿Es esto algo que he codificado incorrectamente o hay una configuración incorrecta en mi computadora?

=== EDITAR ===

Esto es realmente molesto. Ya soy consciente de que el navegador es IE, pero antes lo tenía funcionando bien. Cuando hice clic en un enlace, se abrió en Chrome. Estaba usando desarrollo agudo para hacer la aplicación en ese momento porque no pude hacer que c # express se iniciara. Hice una nueva instalación de Windows y como no estaba muy avanzada en mi aplicación, decidí comenzar de nuevo, y ahora tengo este problema. Es por eso que no estoy seguro de si es mi computadora o no. ¿Por qué IE iniciaría todo el navegador cuando se hace clic en un enlace en lugar de simplemente abrir el nuevo enlace en el navegador predeterminado?

Sean
fuente
Jeje, convencer a IE de que abra Chrome para usted será una batalla cuesta arriba. Bueno, no un poquito. Esto tampoco funciona si ejecuta IE directamente. O Chrome para el caso si IE es el predeterminado.
Hans Passant
@SLaks Mono? ¿De qué estás hablando?
Sean
1) getstartMenuDir Busque Firefox o Chrome StandartName Besure. si no se encuentra 2) obtenga una lista de ubicaciones de instalación estándar que alguna vez existieron 32 64 chrome ff use eso. si no 3) el último recurso usa las respuestas.
bh_earth0

Respuestas:

506

Solo puedes escribir

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

EDITAR : El WebBrowsercontrol es una copia incrustada de IE.
Por lo tanto, cualquier enlace dentro de él se abrirá en IE.

Para cambiar este comportamiento, puede manejar el Navigatingevento.

SLaks
fuente
1
Intentalo. Utilice Taskmgr.exe, verá dos copias de iexporer.exe ejecutándose. Navegar no dispara para el fuera de proceso.
Hans Passant
44
@Sean: Sí. Process.Start(e.Url.ToString())
SLaks
2
La URL local (archivo: ///) no funciona con una cadena de consulta a menos que se especifique el exe del navegador como primer parámetro.
HerrimanCoder
2
Tenga en cuenta que este método también puede introducir un problema de seguridad, ya que, si la "url" se reemplaza con una ruta física a una aplicación, también se ejecutará
Gerrie Pretorius
1
@Spencer: asegúrese de que la URL sea confiable.
SLaks
45

Para aquellos que encuentran esta pregunta en dotnet core. Encontré una solución aquí

Código:

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("cmd", $"/c start {url}") { CreateNoWindow = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            Process.Start("xdg-open", url);
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            Process.Start("open", url);
        }
        else
        {
            throw;
        }
    }
}
Joel Harkes
fuente
¡Gracias! funciona para mí ... pero en macos con opencomando en lugar dexdg-open
equiman
@Equiman no hace eso? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)¿O ya será cierto en Linux?
Joel Harkes
Lo hice. Pero xdg-commanddevuelve "xdg-open: comando no encontrado". Luego probé con opencomando y funciona.
equiman
@Equiman, entonces, ¿estás diciendo que debería cambiar elseif Linux y OSX para que funcione o macos no se cae Uner OSX?
Joel Harkes
1
Creo que no ... mi solución es una buena alternativa.
equiman
38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

eso debería resolver tu problema

user2193090
fuente
77
debería ser 'GotoSite vacío estático'
Behrooz
15

¿Intentó Processcomo se menciona aquí: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Podrías usar

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
fuente
1
UseShellExecuteel valor predeterminado es verdadero.
SLaks
44
@SLaks, gracias. Por otro lado, es importante mencionar que tiene que ser así true.
Andreas
1
Para aquellos demasiado flojos para verificar ... El proceso requiere "usar System.Diagnostics"
Nick Roberts
Esta parece ser la ruta requerida por WPF. Si lo hace Process.Start(url), no abre una nueva ventana del navegador.
RubyHaus
5

Echa un vistazo al control GeckoFX .

GeckoFX es un componente de código abierto que facilita la inserción de Mozilla Gecko (Firefox) en cualquier aplicación .NET Windows Forms. Escrito en C # limpio y completamente comentado, GeckoFX es el reemplazo perfecto para el control predeterminado de WebBrowser basado en Internet Explorer.

EL DOCTOR
fuente
Mi problema es que tengo un navegador web en la aplicación, así que digamos que vaya a google y escriba "desbordamiento de pila" y haga clic derecho en el primer enlace y haga clic en "Abrir en una nueva ventana" se abre en IE en lugar de Chrome. ¿Es esto algo que he codificado incorrectamente, o hay una configuración incorrecta en mi computadora
Sean
@SLaks: ¿Por qué dices eso? No creo que sea difícil escribir una cadena y establecerla igual a GetDefaultBrowserPath ().
EL DOCTOR
@Sean: si tiene un navegador web dentro de su aplicación, entonces usará IE por defecto. El evento de navegación puede ayudarlo a evitarlo.
EL DOCTOR
He modificado mi respuesta después de darme cuenta de que OP no desea cambiar el navegador predeterminado iniciado por un proceso separado.
EL DOCTOR
5

Prueba esto, a la vieja escuela;)

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

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

Moh.Kirkuk
fuente
2
¿No se puede explotar esto, ala, "Shellsock"?
Joseph Lennox
@JosephLennox ese es un excelente punto! Probablemente valga la pena mencionar que System.Diagnostics.Process.Start en la URL directamente no es mucho más seguro. Por otro lado, si el usuario está ejecutando su aplicación en SU ​​computadora (probablemente lo estén), lo peor que pueden hacer es romper su propio sistema: P
Ben
44
@Ben Depende de dónde proviene la entrada. Si se trata de una fuente de datos compartida, una vez que el usuario pueda ingresar un comando malicioso y todos los demás usuarios que hagan clic en "Ir" estarán a merced de ese usuario.
Dan Bechard
4

Después de investigar mucho, creo que la mayor parte de la respuesta dada no funcionará con dotnet core. 1 System.Diagnostics.Process.Start("http://google.com").; - No funcionará con el núcleo dotnet

2. Funcionará pero bloqueará la apertura de la nueva ventana en caso de que el navegador predeterminado sea Chrome

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

A continuación se muestra el más simple y funcionará en todos los escenarios.

Process.Start("explorer", url);
Mayank Tripathi
fuente
Esto lo resolvió para mí.
Rufw91
3

Esto abrió el valor predeterminado para mí:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Xero Phane
fuente
¿Hay algún paquete que esté usando que le otorgue a EventArgs la propiedad de LinkText?
Nick Roberts
3

dotnet corearroja un error si lo usamos Process.Start(URL). El siguiente código funcionará en dotnet core. Puede agregar cualquier navegador en lugar de Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);
Natarajan Ganapathi
fuente
3
No es una respuesta a la Q, el código no sabe cuál es el navegador predeterminado
Arjan el
0

En UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Kibernetik
fuente
Este es Launcher.LaunchUriAsync . Siga el enlace para ver el ejemplo completo. Curiosamente, el valor de retorno permite a la persona que llama saber si la URL se abrió o no. Cuidado, esto es para Windows 8 / Server2012 / Phone8 y superior. Si el software tiene que ser compatible con versiones anteriores, no puede usarlo.
Stéphane Gourichon
0

Abrir dinámicamente

string addres= "Print/" + Id + ".htm";
           System.Diagnostics.Process.Start(Path.Combine(Environment.CurrentDirectory, addres));
سیدرسول میرعظیمی
fuente
0

actualice el registro con la versión actual de 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
fuente