So öffnen Sie im Standardbrowser in C #

257

Ich entwerfe eine kleine C # -Anwendung und darin befindet sich ein Webbrowser. Ich habe derzeit alle meine Standardeinstellungen auf meinem Computer, z. B. Google Chrome ist mein Standardbrowser. Wenn ich jedoch auf einen Link in meiner Anwendung klicke, um ihn in einem neuen Fenster zu öffnen, wird der Internet Explorer geöffnet. Gibt es eine Möglichkeit, diese Links stattdessen im Standardbrowser zu öffnen? Oder stimmt etwas auf meinem Computer nicht?

Mein Problem ist, dass ich einen Webbrowser in der Anwendung habe. Nehmen Sie also an, Sie gehen zu Google und geben "Stapelüberlauf" ein. Klicken Sie mit der rechten Maustaste auf den ersten Link und klicken Sie auf "In neuem Fenster öffnen". Dieser wird im IE anstelle von Chrome geöffnet. Ist dies etwas, das ich falsch codiert habe, oder ist auf meinem Computer eine Einstellung nicht korrekt?

=== BEARBEITEN ===

Das ist wirklich nervig. Ich bin mir bereits bewusst, dass der Browser IE ist, aber ich hatte es vorher gut funktioniert. Wenn ich auf einen Link geklickt habe, wurde er in Chrom geöffnet. Ich habe damals Sharp Develop verwendet, um die Anwendung zu erstellen, da ich c # express nicht zum Starten bringen konnte. Ich habe eine neue Windows-Installation durchgeführt und da ich in meiner Anwendung nicht zu weit fortgeschritten war, habe ich mich entschlossen, von vorne zu beginnen, und jetzt habe ich dieses Problem. Deshalb bin ich mir nicht sicher, ob es mein Computer ist oder nicht. Warum sollte der IE den gesamten Browser starten, wenn auf einen Link geklickt wird, anstatt einfach den neuen Link im Standardbrowser zu öffnen?

Sean
quelle
Hehe, IE davon zu überzeugen, Chrome für Sie zu öffnen, wird ein harter Kampf. Na ja, kein bisschen. Dies funktioniert auch nicht, wenn Sie den IE direkt ausführen. Oder Chrome, wenn IE der Standard ist.
Hans Passant
@ Slaks Mono? Worüber redest du?
Sean
1) getstartMenuDir Suche nach Firefox oder Chrome StandartName Besure. wenn nicht gefunden. 2) Holen Sie sich eine Liste der Standardinstallationsorte, die jemals existieren. Wenn nicht 3) Verwenden Sie als letztes Mittel die Antworten.
bh_earth0

Antworten:

505

Du kannst einfach schreiben

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

BEARBEITEN : Das WebBrowserSteuerelement ist eine eingebettete Kopie des IE.
Daher werden alle darin enthaltenen Links im IE geöffnet.

Um dieses Verhalten zu ändern, können Sie das NavigatingEreignis behandeln.

SLaks
quelle
1
Versuch es. Wenn Sie Taskmgr.exe verwenden, werden zwei Kopien von iexporer.exe ausgeführt. Das Navigieren wird nicht für den Prozess ausgelöst.
Hans Passant
4
@ Sean: Ja. Process.Start(e.Url.ToString())
SLaks
2
Die lokale URL (Datei: ///) funktioniert nur mit einem Querystring, wenn die Browser-Exe als erster Parameter angegeben ist.
HerrimanCoder
2
Beachten Sie, dass diese Can-Methode auch ein Sicherheitsproblem verursachen kann, da die "URL", wenn sie durch einen physischen Pfad zu einer Anwendung ersetzt wird, ebenfalls ausgeführt wird
Gerrie Pretorius,
1
@Spencer: Stellen Sie sicher, dass die URL vertrauenswürdig ist.
SLaks
45

Für diejenigen, die diese Frage im Dotnet-Kern finden. Ich habe hier eine Lösung gefunden

Code:

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
quelle
Vielen Dank! funktioniert für mich ... aber in Macos mit openBefehl anstelle vonxdg-open
Equiman
@ Equiman macht das nicht? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)oder wird es unter Linux schon wahr sein?
Joel Harkes
Ich hab es gemacht. xdg-commandGibt aber "xdg-open: Befehl nicht gefunden" zurück. Dann habe ich mit openBefehl getestet und funktioniert.
Equiman
@ Equiman, also sagst du, ich sollte elseif Linux und OSX wechseln, damit es funktioniert, oder fallen Macos nicht unter OSX?
Joel Harkes
1
Ich denke nicht ... meine Lösung ist eine Art Alternative.
Equiman
38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

das sollte dein Problem lösen

user2193090
quelle
7
sollte 'statische Leere sein GotoSite'
Behrooz
15

Haben Sie versucht, Processwie hier erwähnt: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Du könntest benutzen

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
quelle
1
UseShellExecuteDer Standardwert ist true.
SLaks
4
@SLaks, danke. Auf der anderen Seite ist es wichtig zu erwähnen, dass es sein muss true.
Andreas
1
Für diejenigen, die zu faul sind, um zu überprüfen ... Prozess erfordert "using System.Diagnostics"
Nick Roberts
Dies scheint die von WPF geforderte Route zu sein. Wenn Sie dies nur tun Process.Start(url), wird kein neues Browserfenster geöffnet.
RubyHaus
5

Schauen Sie sich das GeckoFX-Steuerelement an .

GeckoFX ist eine Open-Source-Komponente, mit der Mozilla Gecko (Firefox) problemlos in jede .NET Windows Forms-Anwendung eingebettet werden kann. GeckoFX wurde in sauberem, vollständig kommentiertem C # geschrieben und ist der perfekte Ersatz für das standardmäßige Internet Explorer-basierte WebBrowser-Steuerelement.

DER DOKTOR
quelle
Mein Problem ist, dass ich einen Webbrowser in der Anwendung habe. Nehmen Sie also an, Sie gehen zu Google und geben "Stapelüberlauf" ein. Klicken Sie mit der rechten Maustaste auf den ersten Link und klicken Sie auf "In neuem Fenster öffnen". Dieser wird im IE anstelle von Chrome geöffnet. Ist dies etwas, das ich falsch codiert habe, oder gibt es eine Einstellung, die auf meinem Computer nicht korrekt ist
Sean
@SLaks: Warum sagst du das? Ich glaube nicht, dass es überhaupt schwierig ist, einen String zu schreiben und ihn gleich GetDefaultBrowserPath () zu setzen.
DER ARZT
@ Sean: Wenn Ihre Anwendung einen Webbrowser enthält, wird standardmäßig der IE verwendet. Das Navigationsereignis kann Ihnen dabei helfen, dies zu umgehen.
DER ARZT
Ich habe meine Antwort geändert, nachdem ich festgestellt habe, dass OP den durch einen separaten Prozess gestarteten Standardbrowser nicht ändern möchte.
DER ARZT
5

Versuchen Sie dies nach alter Schule;)

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

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

Moh.Kirkuk
quelle
2
Kann das nicht ausgenutzt werden, ala "Shellsock"?
Joseph Lennox
@ JosephLennox das ist ein ausgezeichneter Punkt! Es ist wahrscheinlich erwähnenswert, dass System.Diagnostics.Process.Start auf der URL direkt nicht viel (keine?) sicherer ist! Auf der anderen Seite, wenn der Benutzer Ihre Anwendung auf IHREM Computer ausführt (was wahrscheinlich der Fall ist), ist das Schlimmste, was er tun kann, sein eigenes System
Ben
4
@Ben Hängt davon ab, woher die Eingabe kommt. Wenn es sich um eine gemeinsam genutzte Datenquelle handelt, sind alle anderen Benutzer, die auf "Los" klicken, dem Benutzer ausgeliefert, sobald sie einen böswilligen Befehl eingeben können.
Dan Bechard
4

Nachdem ich viel recherchiert habe, habe ich das Gefühl, dass die meisten der gegebenen Antworten nicht mit Dotnet Core funktionieren. 1 . System.Diagnostics.Process.Start("http://google.com"); - Funktioniert nicht mit Dotnet Core

2. Es wird funktionieren, aber es wird das Öffnen des neuen Fensters blockieren, falls der Standardbrowser Chrome ist

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

Unten ist die einfachste und funktioniert in allen Szenarien.

Process.Start("explorer", url);
Mayank Tripathi
quelle
Das hat es für mich gelöst.
Rufw91
3

Dies öffnete die Standardeinstellung für mich:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Xero Phane
quelle
Gibt es ein Paket, das Sie verwenden und das EventArgs die Eigenschaft von LinkText gibt?
Nick Roberts
3

dotnet corelöst einen Fehler aus, wenn wir verwenden Process.Start(URL). Der folgende Code funktioniert in dotnet core. Sie können stattdessen einen beliebigen Browser hinzufügen Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);
Natarajan Ganapathi
quelle
3
Keine Antwort auf das Q, es ist dem Code nicht bekannt, was der Standardbrowser ist
Arjan
0

In UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Kibernetik
quelle
Dies ist Launcher.LaunchUriAsync . Folgen Sie dem Link für ein vollständiges Beispiel. Interessanterweise kann der Anrufer anhand des Rückgabewerts feststellen, ob die URL geöffnet wurde oder nicht. Beachten Sie, dass dies für Windows 8 / Server2012 / Phone8 und höher gilt. Wenn die Software mit älteren Versionen kompatibel sein muss, kann sie das nicht verwenden.
Stéphane Gourichon
0

Dynamisch öffnen

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

Aktualisieren Sie die Registrierung mit der aktuellen Version von 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
quelle