Standard-Browser in C# auslesen

csharp_standard_browserNachfolgend soll es darum gehen, wie man den Pfad zum Standard-Browser unter Windows in C# herausfindet. Dies macht zum Beispiel immer dann Sinn, wenn man eine Datei mittels Process.Start() im Standard-Browser öffnen möchte.

Zwar könnte man davon ausgehen, dass jeder Windowsnutzer auch den Internet Explorer installiert hat und man somit einfach diesen zum Anzeigen von Dateien benutzen sollte,  jedoch erhöht es nicht unbedingt das Vertrauen des Users in die eigene Applikation. So wäre zumindest ich als Benutzer meines Programms davon genervt, wenn dieser immer den Internet Explorer anstelle des Firefox, welchen ich als Standard-Browser festgelegt habe, starten würde.

Nun gibt es zwei Möglichkeiten den Standard-Browser in C# zu öffnen. Beide haben Ihre Vor- und Nachteile.

Variante 1 – Process.Start() mit URL als Startpfad

Die einfachste Variante den Standard-Browser zu starten, ist es einfach mittels der Process-Klasse einen neuen Prozess zu starten. Als Startpfad für den Process wird die zu öffnende Url übergeben.

string url = "http://google.de";
Process.Start(url);

Diese zwei Zeilen reichen aus, um die angegebene Url im Standard-Browser zu öffnen. Problematisch wird es jedoch, wenn in der Variable “url” keine gültige Url steht. In diesem Fall kann es zu einer Exception kommen, da das .NET-Framework nicht unbedingt weiß, mit welcher Anwendung der übergebene Parameter gestartet werden soll.

Dies kann zum Beispiel sein, wenn ihr keinen Einfluss auf den Url-Parameter habt und, egal was dort drin steht, die Url oder Datei im Standard-Browser öffnen wollt. Hierfür ist Variante 2 geeignet.

Variante 2 – Den Standard-Browser in C# auslesen

Um in jedem Fall den Standard-Browser zu öffnen und diesen im Zweifelsfall entscheiden zu lassen, ob er die Url/Datei öffnen oder anzeigen kann, ist es nötig den Pfad des Standard-Browser zu kennen. Hierzu könnt ihr folgende kleine Funktion benutzen, die den Pfad des Standard-Browsers aus der Registry ausliest.

private static string GetStandardBrowserPath()
{
    string browserPath = string.Empty;
    RegistryKey browserKey = null;

    try
    {
        //Überprüfe den Pfad für Windows XP
        browserKey = Registry.ClassesRoot.OpenSubKey(@"HTTPshellopencommand", false);

        //Wenn kein XP Pfad gefunden wurde, überprüfe den Pfad für Windows Vista und neuer
        if (browserKey == null)
        {
            browserKey = Registry.CurrentUser.OpenSubKey(@"SoftwareMicrosoftWindowsShellAssociationsUrlAssociationshttp", false); ;
        }

        //Wenn ein Pfad ein gefunden wurde, schneide eventuelle Parameter am Pfad ab
        if (browserKey != null)
        {
            //Entferne Hochkommata
            browserPath = (browserKey.GetValue(null) as string).ToLower().Replace(""", "");

            //Schneide evtl. Parameter ab
            if (!browserPath.EndsWith("exe"))
            {
                browserPath = browserPath.Substring(0, browserPath.LastIndexOf(".exe") + 4);
            }

            //Schließe Registry-Schlüssel
            browserKey.Close();
        }
    }
    catch
    {
        //Wenn kein Standard-Browser gefunden wurde, gebe leeren Pfad zurück
        return string.Empty;
    }
    //Gebe Browser-Pfad zurück
    return browserPath;
}

Diese Funktion wird nun wieder mittels der Process.Start()-Funktion genutzt. Die Url wird dieses mal jedoch als Parameter und nicht als Stardpfad übergeben.

string url = "http://google.de";
string browserPath = GetStandardBrowserPath();
if (string.IsNullOrEmpty(browserPath))
{
    MessageBox.Show("No standard browser found!");
}
else
{
    Process.Start(browserPath, url);
}

Fazit

Das war es auch schon. Wenn ihr also sicher seid, dass die Urls in einem validen Format vorliegen, so solltet ihr Variante 1 nutzen. Wenn ihr dies nicht sicherstellen könnt oder vielleicht Dateien in eurem eigenen Format oder mit eurer eigenen Dateiendung öffnen wollt, so ist Variante 2 geeignet. Bei Variante 2 sollte jedoch bedacht werden, dass eure Applikation, je nach User-Kontext, in dem Sie ausgeführt wird, explizit Administrationsrechte benötigt!

Wie geht ihr mit dem “Problem” um? Habt ihr auch eine Lösung, die auf der Registry beruht oder geht ihr vielleicht einen ganz anderen Weg?

1 Kommentare

  1. ich kann die Funktion leider nicht nutzen, weil das Programm mit dem Wort Registry nichts anfangen kann und da auch nichts findet. Schade, ich hätte die Funktion echt gebraucht

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.