Como abrir uma página da web do meu aplicativo?

126

Desejo que meu aplicativo WPF abra o navegador padrão e vá para uma determinada página da web. Como faço isso?

Alex Baranosky
fonte

Respostas:

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

Uma de muitas maneiras.

Inisheer
fonte
3
Eu usei isso também, mas agora acontece que isso não funciona com o UAC. No meu aplicativo, tenho isso no manifesto <requestExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Quando executo o aplicativo no Windows 8 (onde você não pode mais desativar o UAC), recebo a seguinte exceção ao abrir uma página da web : Win32Exception (0x80004005): Classe não registrada em System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer
Esse efeito não ocorrerá quando eu alterar o requireAdministrator para asInvoker. Mas, em seguida, o aplicativo não é elevado :-(
lvmeijer
4
Isso pode abrir uma brecha de segurança bastante grande no seu aplicativo se você obtiver acidentalmente o URL da entrada do usuário e não validar que é um URI. Eles podem iniciar qualquer aplicativo que desejarem no seu sistema.
Cdggins #
1
FYI: Funciona em Unity, Mono, no OS X e Windows. Não funciona no iOS. Eu não testei os outros.
Grant H
2
Que tal abrir um arquivo html local?
precisa saber é o seguinte
34

Eu tenho usado esta linha para iniciar o navegador padrão:

System.Diagnostics.Process.Start("http://www.google.com"); 
ajma
fonte
1
Esta resposta é uma duplicata.
MAXE
1
@MAXE As duas respostas foram criadas no mesmo minuto.
4424dev 20/02
20

A resposta aceita não funciona mais no .NET Core 3 . Para fazê-lo funcionar, use o seguinte método:

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

Embora tenha sido dada uma boa resposta (usando Process.Start), é mais seguro encapsulá-la em uma função que verifica se a sequência passada é realmente um URI, para evitar iniciar acidentalmente processos aleatórios na 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
fonte
6

Você não pode iniciar uma página da web a partir de um aplicativo elevado. Isso gerará uma exceção 0x800004005, provavelmente porque o explorer.exe e o navegador não estão sendo elevados.

Para iniciar uma página da Web a partir de um aplicativo elevado em um navegador não elevado, use o código criado por Mike Feng . Tentei passar o URL para lpApplicationName, mas isso não funcionou. Também não quando eu uso CreateProcessWithTokenW com lpApplicationName = "explorer.exe" (ou seja, xexplore.exe) e lpCommandLine = url.

A seguinte solução alternativa funciona: Crie um pequeno projeto EXE que tenha uma tarefa: Process.Start (url), use CreateProcessWithTokenW para executar este .EXE. No meu Windows 8 RC, isso funciona bem e abre a página da web no Google Chrome.

lvmeijer
fonte
1
Veja o comentárioExplorer.exe : não é possível usar o comando para remover a elevação: "Infelizmente, a equipe do Windows Shell respondeu que o comportamento atual de" Explorer.exe AppName.exe "é um bug e pode não funcionar em futuras atualizações / versões do Windows. Aplicativos não deve confiar nele. "
Carl Walsh
4

Aqui está o meu código completo de como abrir.

existem 2 opções:

  1. abrir usando o navegador padrão (o comportamento é como o aberto dentro da janela do navegador)

  2. aberto através das opções de comando padrão (o comportamento é como você usa o comando "RUN.EXE")

  3. aberto através do 'explorer' (o comportamento é como o que você escreveu na URL da janela da pasta)

[sugestão opcional] 4. use o local do processo iexplore para abrir o URL necessário

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

e a função 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 ter ajudado.

mr.baby123
fonte
3
O que eu quero saber é ... por que torná-lo tão complicado quando várias pessoas simplificaram bastante a resposta à pergunta?
CularBytes
Por que não usar o SearchPath em vez dos seus GetWindowsPath?
precisa saber é o seguinte
3
Por que blocos vazios de captura? Não é uma má idéia apenas engolir exceções?
reggaeguitar
3

O jeito da velha escola;)

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

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

Moh.Kirkuk
fonte
2

Eu tenho a solução para isso devido a um problema semelhante hoje.

Suponha que você queira abrir http://google.com a partir de um aplicativo em execução com privilégios de administrador:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 
winsetter
fonte
1
quais referências / namespaces devo usar para esta solução?
SophisticatedUndoing
1
@SophisticatedUndoing Acredito ProcessStartInfo e Processo estão localizados em System.Diagnostics
Francis Senhor