Come aprire nel browser predefinito in C #


258

Sto progettando una piccola applicazione C # e al suo interno c'è un browser. Attualmente ho tutte le mie impostazioni predefinite sul mio computer che dicono che Google Chrome è il mio browser predefinito, ma quando faccio clic su un collegamento nella mia applicazione per aprirlo in una nuova finestra, si apre Internet Explorer. Esiste un modo per aprire questi collegamenti nel browser predefinito? O c'è qualcosa di sbagliato sul mio computer?

Il mio problema è che ho un browser web nell'applicazione, quindi dì di andare su google e digitare "stack overflow" e fare clic con il tasto destro del mouse sul primo collegamento e fare clic su "Apri in una nuova finestra" che si apre in IE anziché in Chrome. È qualcosa che ho codificato in modo errato o c'è un'impostazione non corretta sul mio computer?

=== === EDIT

Questo è davvero fastidioso. Sono già a conoscenza del fatto che il browser è IE, ma in precedenza funzionava bene. Quando ho fatto clic su un collegamento, questo si è aperto in Chrome. Stavo usando Sharp Develop per rendere l'applicazione in quel momento perché non riuscivo a far avviare c # express. Ho fatto una nuova installazione di Windows e poiché non ero troppo lontano nella mia applicazione, ho deciso di ricominciare da capo, e ora ho questo problema. Ecco perché non sono sicuro che si tratti del mio computer o meno. Perché IE dovrebbe avviare l'intero browser quando si fa clic su un collegamento anziché semplicemente aprire il nuovo collegamento nel browser predefinito?


Hehe, convincere IE ad aprire Chrome per te sarà un po 'una battaglia in salita. Beh, non un po '. Questo non funziona neanche se si esegue IE direttamente. O Chrome, del resto, se IE è l'impostazione predefinita.
Hans Passant,

@SLaks Mono? Di cosa stai parlando?
Sean,

1) getstartMenuDir Cerca Firefox o Chrome StandartName Besure. se non trovato. 2) ottenere l'elenco dei percorsi di installazione standard mai esistenti 32 64 chrome ff usarlo. se non 3) ultima risorsa usa le risposte.
bh_earth0

Risposte:


506

Puoi semplicemente scrivere

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

EDIT : il WebBrowsercontrollo è una copia incorporata di IE.
Pertanto, qualsiasi link al suo interno si aprirà in IE.

Per modificare questo comportamento, è possibile gestire l' Navigatingevento.


1
Provalo. Usa Taskmgr.exe, vedrai due copie di iexporer.exe in esecuzione. La navigazione non si attiva per quella fuori processo.
Hans Passant,

4
@Sean: Sì. Process.Start(e.Url.ToString())
SLaks

2
L'URL locale (file: ///) non funziona con una stringa di query a meno che browser exe non sia specificato come primo parametro.
HerrimanCoder

2
Tieni presente che questo metodo può anche introdurre un problema di sicurezza, poiché, se "url" viene sostituito con un percorso fisico a un'applicazione, verrà eseguito anche
Gerrie Pretorius,

1
@Spencer: assicurati che l'URL sia attendibile.
SLaks

45

Per coloro che trovano questa domanda nel core dotnet. Ho trovato una soluzione qui

Codice:

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

Grazie! funziona per me ... ma in macos con opencomando invece dixdg-open
equiman,

@Equiman non lo fa? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)o sarà già vero su Linux?
Joel Harkes,

L'ho fatto. Ma xdg-commandrestituisce "xdg-open: comando non trovato". Poi ho provato con il opencomando e funziona.
equiman,

@Equiman, quindi stai dicendo che dovrei cambiare altro se Linux e OSX in giro per farlo funzionare o macos non cade udner OSX?
Joel Harkes,

1
Penso di no ... la mia soluzione è una specie di alternativa.
equiman,

38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

questo dovrebbe risolvere il tuo problema


7
dovrebbe essere 'vuoto statico GotoSite'
Behrooz,

15

Hai provato Processcome indicato qui: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Puoi usare

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

1
UseShellExecuteil valore predefinito è true.
SLaks

4
@SLaks, grazie. D'altra parte è importante ricordare che deve esserlo true.
Andreas,

1
Per quelli troppo pigri per controllare ... Il processo richiede "usando System.Diagnostics"
Nick Roberts,

Questo sembra essere il percorso richiesto da WPF. Se lo fai Process.Start(url), non si apre una nuova finestra del browser.
RubyHaus,

5

Dai un'occhiata al controllo GeckoFX .

GeckoFX è un componente open source che semplifica l'integrazione di Mozilla Gecko (Firefox) in qualsiasi applicazione .NET Windows Forms. Scritto in C # pulito e completamente commentato, GeckoFX è il sostituto perfetto per il controllo WebBrowser predefinito basato su Internet Explorer.


Il mio problema è che ho un browser web nell'applicazione, quindi dì di andare su google e digitare "stack overflow" e fare clic con il tasto destro del mouse sul primo link e fare clic su "Apri in una nuova finestra" che si apre in IE anziché in Chrome. È qualcosa che ho codificato in modo errato o c'è un'impostazione non corretta sul mio computer
Sean

@SLaks: Perché dici così? Non credo sia affatto difficile creare una stringa e impostarla come GetDefaultBrowserPath ().
IL MEDICO

@Sean: se nella tua applicazione è presente un browser web, per impostazione predefinita verrà utilizzato IE. L'evento Navigating può aiutarti a evitarlo.
IL MEDICO

Ho modificato la mia risposta dopo aver realizzato che OP non desidera modificare il browser predefinito avviato da un processo separato.
IL MEDICO

5

Prova questo, alla vecchia maniera;)

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

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


2
Non può essere sfruttato, ala, "Shellsock"?
Joseph Lennox,

@JosephLennox è un punto eccellente! probabilmente vale la pena ricordare che System.Diagnostics.Process.Start direttamente sull'URL non è molto (alcuno?) più sicuro! d'altra parte, se l'utente sta eseguendo l'applicazione sul proprio computer (probabilmente lo sono), il peggio che può fare è rompere il proprio sistema: P
Ben

4
@Ben Dipende da dove proviene l'input. Se si tratta di un'origine dati condivisa, una volta che l'utente potrebbe immettere un comando dannoso e tutti gli altri utenti che fanno clic su "Vai" sarebbero in balia di quell'utente.
Dan Bechard,

4

Dopo aver fatto molte ricerche, ritengo che la maggior parte della risposta fornita non funzionerà con dotnet core. 1 System.Diagnostics.Process.Start("http://google.com").; - Non funzionerà con dotnet core

2. Funzionerà ma bloccherà l'apertura della nuova finestra nel caso in cui il browser predefinito sia Chrome

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

Di seguito è riportato il più semplice e funzionerà in tutti gli scenari.

Process.Start("explorer", url);

Questo mi ha risolto.
Rufw91,

3

Questo mi ha aperto il valore predefinito:

System.Diagnostics.Process.Start(e.LinkText.ToString());

Esiste un pacchetto che stai utilizzando che dà a EventArgs la proprietà di LinkText?
Nick Roberts,

3

dotnet coregenera un errore se lo utilizziamo Process.Start(URL). Il seguente codice funzionerà in dotnet core. È possibile aggiungere qualsiasi browser anziché Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);

3
Non è una risposta alla Q, non è noto al codice quale sia il browser predefinito
Arjan,

0

In UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));

Questo è Launcher.LaunchUriAsync . Segui il link per un esempio completo. È interessante notare che il valore di ritorno consente al chiamante di sapere se l'URL è stato aperto o meno. Attenzione, questo è per Windows 8 / Server2012 / Phone8 e versioni successive. Se il software deve essere compatibile con le versioni precedenti, non può utilizzarlo.
Stéphane Gourichon,


0

aggiorna il registro con la versione corrente di 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.