¿Cómo abrir una página web desde mi aplicación?

126

Quiero que mi aplicación WPF abra el navegador predeterminado y vaya a una determinada página web. ¿Cómo puedo hacer eso?

Alex Baranosky
fuente

Respuestas:

266
System.Diagnostics.Process.Start("http://www.webpage.com");

Una de muchas maneras.

Inisheer
fuente
3
También usé esto, pero ahora resulta que esto no funciona con UAC. En mi aplicación, tengo esto en el manifiesto <requiredExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Cuando ejecuto la aplicación en Windows 8 (donde ya no puede deshabilitar UAC), obtengo la siguiente excepción al abrir una página web : Win32Exception (0x80004005): Clase no registrada en System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer
Este efecto no sucederá cuando cambie requireAdministrator a asInvoker. Pero entonces la aplicación no está elevada :-(
lvmeijer
44
Esto podría abrir un agujero de seguridad bastante grande en su aplicación si tuviera que obtener accidentalmente la URL de la entrada del usuario y no validar que es un URI. Luego pueden iniciar cualquier aplicación que deseen en su sistema.
cdiggins
1
FYI: Funciona en Unity, Mono, en Os X y Windows. No funciona en iOS. No probé a los demás.
Grant M
2
¿Qué tal abrir un archivo html local?
guogangj
34

He estado usando esta línea para iniciar el navegador predeterminado:

System.Diagnostics.Process.Start("http://www.google.com"); 
ajma
fuente
1
Esta respuesta es un duplicado.
MAXE
1
@MAXE Las dos respuestas se crearon en el mismo minuto.
4424dev
20

La respuesta aceptada ya no funciona en .NET Core 3 . Para que funcione, use el siguiente método:

var psi = new ProcessStartInfo
{
    FileName = url,
    UseShellExecute = true
};
Process.Start (psi);
Alexander Smirnov
fuente
19

Si bien se ha dado una buena respuesta (usando Process.Start), es más seguro encapsularla en una función que verifique que la cadena pasada sea de hecho un URI, para evitar iniciar accidentalmente procesos aleatorios en la máquina.

public static bool IsValidUri(string uri)
{
    if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
        return false;
    Uri tmp;
    if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
        return false;
    return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}

public static bool OpenUri(string uri) 
{
    if (!IsValidUri(uri))
        return false;
     System.Diagnostics.Process.Start(uri);
     return true;
}
cdiggins
fuente
6

No puede iniciar una página web desde una aplicación elevada. Esto generará una excepción 0x800004005, probablemente porque explorer.exe y el navegador se ejecutan sin elevación.

Para iniciar una página web desde una aplicación elevada en un navegador web no elevado, utilice el código creado por Mike Feng . Traté de pasar la URL a lpApplicationName pero eso no funcionó. Tampoco cuando uso CreateProcessWithTokenW con lpApplicationName = "explorer.exe" (o iexplore.exe) y lpCommandLine = url.

La siguiente solución funciona: Cree un pequeño proyecto EXE que tenga una tarea: Process.Start (url), use CreateProcessWithTokenW para ejecutar este .EXE. En mi Windows 8 RC esto funciona bien y abre la página web en Google Chrome.

lvmeijer
fuente
1
Vea el comentario , Explorer.exeno se admite el uso de la elevación: "Desafortunadamente, el equipo de Windows Shell ha respondido que el comportamiento actual de" Explorer.exe AppName.exe "es un error y puede no funcionar en futuras actualizaciones / versiones de Windows. Aplicaciones no debe confiar en ello ".
Carl Walsh
4

Aquí está mi código completo de cómo abrir.

hay 2 opciones:

  1. abrir usando el navegador predeterminado (el comportamiento es como abrir dentro de la ventana del navegador)

  2. abrir a través de las opciones de comando predeterminadas (el comportamiento es como si usara el comando "RUN.EXE")

  3. abrir a través de 'explorer' (el comportamiento es como si escribieras la URL dentro de la ventana de la carpeta)

[sugerencia opcional] 4. utilice la ubicación del proceso iexplore para abrir la url requerida

CÓDIGO:

internal static bool TryOpenUrl(string p_url)
    {
        // try use default browser [registry: HKEY_CURRENT_USER\Software\Classes\http\shell\open\command]
        try
        {
            string keyValue = Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\Classes\http\shell\open\command", "", null) as string;
            if (string.IsNullOrEmpty(keyValue) == false)
            {
                string browserPath = keyValue.Replace("%1", p_url);
                System.Diagnostics.Process.Start(browserPath);
                return true;
            }
        }
        catch { }

        // try open browser as default command
        try
        {
            System.Diagnostics.Process.Start(p_url); //browserPath, argUrl);
            return true;
        }
        catch { }

        // try open through 'explorer.exe'
        try
        {
            string browserPath = GetWindowsPath("explorer.exe");
            string argUrl = "\"" + p_url + "\"";

            System.Diagnostics.Process.Start(browserPath, argUrl);
            return true;
        }
        catch { }

        // return false, all failed
        return false;
    }

y la función auxiliar:

internal static string GetWindowsPath(string p_fileName)
    {
        string path = null;
        string sysdir;

        for (int i = 0; i < 3; i++)
        {
            try
            {
                if (i == 0)
                {
                    path = Environment.GetEnvironmentVariable("SystemRoot");
                }
                else if (i == 1)
                {
                    path = Environment.GetEnvironmentVariable("windir");
                }
                else if (i == 2)
                {
                    sysdir = Environment.GetFolderPath(Environment.SpecialFolder.System);
                    path = System.IO.Directory.GetParent(sysdir).FullName;
                }

                if (path != null)
                {
                    path = System.IO.Path.Combine(path, p_fileName);
                    if (System.IO.File.Exists(path) == true)
                    {
                        return path;
                    }
                }
            }
            catch { }
        }

        // not found
        return null;
    }

Espero haber ayudado.

mr.baby123
fuente
3
Lo que me pregunto es ... ¿por qué hacerlo tan complicado cuando varias personas hicieron que la respuesta a la pregunta fuera ya simple?
CularBytes
¿Por qué no usar SearchPath en lugar del tuyo GetWindowsPath?
ub3rst4r
3
¿Por qué vaciar bloques de captura? ¿No es una mala idea tragar excepciones?
reggaeguitar
3

La vieja escuela;)

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

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

Moh.Kirkuk
fuente
2

Tengo la solución para esto porque hoy tengo un problema similar.

Supongamos que desea abrir http://google.com desde una aplicación que se ejecuta con privilegios de administrador:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 
winsetter
fuente
1
¿Qué referencias / espacios de nombres debo usar para esta solución?
Sofisticada
1
@SophisticatedUndoing Creo que ProcessStartInfo y Process se encuentran en System.Diagnostics
Francis Lord