Como abrir no navegador padrão em C #

258

Estou projetando um pequeno aplicativo C # e há um navegador da Web nele. Atualmente, tenho todos os meus padrões no meu computador, digamos que o google chrome é o meu navegador padrão, mas quando clico em um link no meu aplicativo para abrir em uma nova janela, ele abre o Internet Explorer. Existe alguma maneira de abrir esses links no navegador padrão? Ou há algo errado no meu computador?

Meu problema é que eu tenho um navegador da web no aplicativo, digamos que você vá ao google e digite "estouro de pilha", clique com o botão direito do mouse no primeiro link e clique em "Abrir em nova janela", ele abre no IE, e não no Chrome. É algo que codifiquei incorretamente ou há uma configuração incorreta no meu computador

=== EDIT ===

Isso é realmente irritante. Eu já estou ciente de que o navegador é o IE, mas eu já estava funcionando bem antes. Quando cliquei em um link, ele foi aberto no chrome. Eu estava usando o sharp sharp para fazer o aplicativo naquele momento, porque não era possível obter o c # express para iniciar. Fiz uma nova instalação do Windows e, como não estava muito adiantado no meu aplicativo, decidi começar de novo e agora estou tendo esse problema. É por isso que não tenho certeza se é meu computador ou não. Por que o IE iniciaria o navegador inteiro quando um link é clicado, em vez de simplesmente abrir o novo link no navegador padrão?

Sean
fonte
Hehe, convencer o IE a abrir o Chrome para você será uma batalha difícil. Bem, nem um pouco. Isso também não funciona se você executar o IE diretamente. Ou Chrome, se o IE for o padrão.
Hans Passant
@SLaks Mono? Do que você está falando?
Sean
1) getstartMenuDir Search para Firefox ou Chrome StandartName Besure. se não for encontrado. 2) obtenha uma lista dos locais de instalação padrão que já existem. se não 3) último recurso, use as respostas.
precisa saber é o seguinte

Respostas:

506

Você pode escrever

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

EDIT : O WebBrowsercontrole é uma cópia incorporada do IE.
Portanto, todos os links dentro dele serão abertos no IE.

Para alterar esse comportamento, você pode manipular o Navigatingevento.

SLaks
fonte
1
Tente. Use Taskmgr.exe, você verá duas cópias do iexporer.exe em execução. A navegação não é acionada para a fora de processo.
Hans Passant
4
@Sean: Sim. Process.Start(e.Url.ToString())
SLaks
2
O URL local (arquivo: ///) não funciona com uma string de consulta, a menos que o exe do navegador seja especificado como o primeiro parâmetro.
precisa saber é o seguinte
2
Esteja ciente de que este método pode também pode introduzir um problema de segurança, uma vez que, se o "url" é substituído por um caminho físico para uma aplicação que também irá executar
Gerrie Pretorius
1
@ Spencer: verifique se o URL é confiável.
SLaks
45

Para quem encontra essa pergunta no núcleo do dotnet. Eu encontrei uma solução aqui

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
fonte
Obrigado! funciona para mim ... mas em macos com opencomando em vez dexdg-open
equiman
@Equiman não faz isso? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)ou isso já será verdade no Linux?
Joel Harkes #
Eu fiz isso. Mas xdg-commandretorna "xdg-open: comando não encontrado". Então eu testei com opencomando e funciona.
equiman
@ Equiman, então você está dizendo que eu deveria mudar o linux e o OSX para fazê-lo funcionar ou o macos não cai no OSX?
Joel Harkes
1
Acho que não ... minha solução é uma alternativa.
equiman
38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

isso deve resolver seu problema

user2193090
fonte
7
deve ser 'static void GotoSite'
Behrooz
15

Você tentou Processconforme mencionado aqui: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Você poderia 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
fonte
1
UseShellExecuteo padrão é true.
Slaks
4
@ Slaks, obrigado. Por outro lado, é importante mencionar que tem que ser true.
Andreas
1
Para aqueles com preguiça de verificar ... Processo exige "usando System.Diagnostics"
Nick Roberts
Essa parece ser a rota exigida pelo WPF. Se você fizer Process.Start(url)isso, ele não abre uma nova janela do navegador.
RubyHaus 16/10/19
5

Dê uma olhada no controle GeckoFX .

O GeckoFX é um componente de código aberto que facilita a incorporação do Mozilla Gecko (Firefox) em qualquer aplicativo .NET Windows Forms. Escrito em C # limpo e totalmente comentado, o GeckoFX é o substituto perfeito para o controle WebBrowser padrão baseado no Internet Explorer.

O MÉDICO
fonte
Meu problema é que eu tenho um navegador da web no aplicativo, digamos que você vá ao google e digite "estouro de pilha" e clique com o botão direito do mouse no primeiro link e clique em "Abrir em nova janela", ele abre no IE, e não no Chrome. Isso é algo que eu codifiquei incorretamente ou há uma configuração incorreta no meu computador
Sean Sean
@ Slaks: Por que você diz isso? Eu não acredito que seja difícil escrever, crie uma string e defina-a como GetDefaultBrowserPath ().
THE DOCTOR
@ Sean: Se você possui um navegador da web em seu aplicativo, ele usará o IE por padrão. O evento Navegando pode ajudá-lo a contornar isso.
THE DOCTOR
Modifiquei minha resposta depois de perceber que o OP não deseja alterar o navegador padrão iniciado por um processo separado.
THE DOCTOR
5

Tente isso da maneira da velha escola;)

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

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

Moh.Kirkuk
fonte
2
Isso não pode ser explorado, ala, "Shellsock"?
Joseph Lennox
@JosephLennox é um ponto excelente! provavelmente vale a pena mencionar que System.Diagnostics.Process.Start na URL diretamente não é muito (algum?) mais seguro! por outro lado, se o usuário estiver executando seu aplicativo no computador (provavelmente), o pior que pode fazer é quebrar o próprio sistema: P
Ben
4
@Ben Depende da origem da entrada. Se for uma fonte de dados compartilhada, uma vez que o usuário possa digitar um comando malicioso e todos os outros usuários que clicarem em "Ir" ficarão à mercê desse usuário.
precisa
4

Depois de pesquisar muito, sinto que a maioria das respostas dadas não funcionará com o núcleo do dotnet. 1System.Diagnostics.Process.Start("http://google.com") .; - Não funcionará com o núcleo dotnet

2. Funcionará, mas bloqueará a nova janela, caso o navegador padrão seja chrome

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

Abaixo está o mais simples e funcionará em todos os cenários.

Process.Start("explorer", url);
Mayank Tripathi
fonte
Isso resolveu para mim.
Rufw91 18/06
3

Isso abriu o padrão para mim:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Xero Phane
fonte
Existe um pacote que você esteja usando que dê a EventArgs a propriedade de LinkText?
Nick Roberts
3

dotnet coregera um erro se usarmos Process.Start(URL). O código a seguir funcionará dotnet core. Você pode adicionar qualquer navegador em vez de Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);
Natarajan Ganapathi
fonte
3
Não é uma resposta à Q, não se sabe ao código que o navegador padrão é
Arjan
0

Em UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Kibernetik
fonte
Este é o Launcher.LaunchUriAsync . Siga o link para obter um exemplo completo. Curiosamente, o valor de retorno permite que o chamador saiba se o URL foi aberto ou não. Cuidado, isso é para Windows 8 / Server2012 / Phone8 e superior. Se o software precisar ser compatível com versões mais antigas, ele não poderá ser usado.
Stéphane Gourichon
0

Abrir dinamicamente

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

atualize o registro com a versão atual do 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
fonte