Wie öffne ich eine Webseite aus meiner Anwendung?

126

Ich möchte, dass meine WPF-Anwendung den Standardbrowser öffnet und zu einer bestimmten Webseite wechselt. Wie mache ich das?

Alex Baranosky
quelle

Antworten:

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

Eine von vielen Möglichkeiten.

Inisheer
quelle
3
Ich habe das auch benutzt, aber jetzt stellt sich heraus, dass dies mit UAC nicht funktioniert. In meiner Anwendung habe ich dies im Manifest <requestExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Wenn ich die App unter Windows 8 ausführe (wo Sie die Benutzerkontensteuerung nicht mehr deaktivieren können), wird beim Öffnen einer Webseite die folgende Ausnahme angezeigt : Win32Exception (0x80004005): Klasse nicht bei System.Diagnostics.Process.StartWithShellExecuteEx registriert
lvmeijer
Dieser Effekt tritt nicht auf, wenn ich requireAdministrator in asInvoker ändere. Aber dann ist die App nicht erhöht :-(
lvmeijer
4
Dies könnte eine ziemlich große Sicherheitslücke in Ihrer Anwendung eröffnen, wenn Sie versehentlich die URL aus Benutzereingaben abrufen und nicht überprüfen, ob es sich um eine URI handelt. Sie können dann jede gewünschte Anwendung auf Ihrem System starten.
Cdiggins
1
Zu Ihrer Information: Funktioniert in Unity, Mono, unter Os X und Windows. Es funktioniert nicht in iOS. Ich habe die anderen nicht getestet.
Grant M
2
Wie wäre es mit dem Öffnen einer lokalen HTML-Datei?
Guogangj
34

Ich habe diese Zeile verwendet, um den Standardbrowser zu starten:

System.Diagnostics.Process.Start("http://www.google.com"); 
Ajma
quelle
1
Diese Antwort ist ein Duplikat.
MAXE
1
@MAXE Die beiden Antworten wurden in derselben Minute erstellt.
4424dev
19

Obwohl eine gute Antwort gegeben wurde (mit Process.Start), ist es sicherer, sie in eine Funktion zu kapseln, die überprüft, ob die übergebene Zeichenfolge tatsächlich eine URI ist, um zu vermeiden, dass versehentlich zufällige Prozesse auf dem Computer gestartet werden.

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
quelle
19

Akzeptierte Antwort funktioniert unter .NET Core 3 nicht mehr . Verwenden Sie die folgende Methode, damit es funktioniert:

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

Sie können eine Webseite nicht über eine Anwendung mit erhöhten Rechten starten. Dies löst eine 0x800004005-Ausnahme aus, wahrscheinlich weil explorer.exe und der Browser nicht erhöht ausgeführt werden.

Verwenden Sie den von Mike Feng erstellten Code, um eine Webseite von einer erhöhten Anwendung in einem nicht erhöhten Webbrowser aus zu starten . Ich habe versucht, die URL an lpApplicationName zu übergeben, aber das hat nicht funktioniert. Auch nicht, wenn ich CreateProcessWithTokenW mit lpApplicationName = "explorer.exe" (oder iexplore.exe) und lpCommandLine = url verwende.

Die folgende Problemumgehung funktioniert: Erstellen Sie ein kleines EXE-Projekt mit einer Aufgabe: Process.Start (URL). Verwenden Sie CreateProcessWithTokenW, um diese EXE-Datei auszuführen. Unter meinem Windows 8 RC funktioniert dies einwandfrei und öffnet die Webseite in Google Chrome.

lvmeijer
quelle
1
Siehe Kommentar , die Verwendung Explorer.exezum De-Elevieren wird nicht unterstützt: "Leider hat das Windows Shell-Team geantwortet, dass das aktuelle Verhalten von" Explorer.exe AppName.exe "ein Fehler ist und möglicherweise in zukünftigen Updates / Versionen von Windows nicht funktioniert. Anwendungen sollte sich nicht darauf verlassen. "
Carl Walsh
4

Hier ist mein vollständiger Code zum Öffnen.

Es gibt 2 Möglichkeiten:

  1. Öffnen mit dem Standardbrowser (Verhalten ist wie im Browserfenster geöffnet)

  2. Öffnen über Standardbefehlsoptionen (Verhalten entspricht der Verwendung des Befehls "RUN.EXE")

  3. über 'Explorer' öffnen (Verhalten ist so, als hätten Sie eine URL in die URL Ihres Ordnerfensters geschrieben)

[optionaler Vorschlag] 4. Verwenden Sie den iexplore-Prozessspeicherort, um die erforderliche URL zu öffnen

CODE:

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

und die Hilfsfunktion:

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

Hoffe ich habe geholfen.

mr.baby123
quelle
3
Was ich mich frage ist ... warum es so kompliziert machen, wenn verschiedene Leute es absolut einfach gemacht haben, die Frage bereits zu beantworten?
CularBytes
Warum nicht einfach SearchPath anstelle Ihres eigenen verwenden GetWindowsPath?
ub3rst4r
3
Warum leere Fangblöcke? Ist es nicht eine schlechte Idee, nur Ausnahmen zu schlucken?
Reggaeguitar
3

Der alte Schulweg;)

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

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

Moh.Kirkuk
quelle
2

Ich habe die Lösung dafür, weil ich heute ein ähnliches Problem habe.

Angenommen, Sie möchten http://google.com über eine App öffnen, die mit Administratorrechten ausgeführt wird:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 
Winsetter
quelle
1
Welche Referenzen / Namespaces soll ich für diese Lösung verwenden?
SophisticatedUndoing
1
@SophisticatedUndoing Ich glaube, ProcessStartInfo und Process befinden sich in System.Diagnostics
Francis Lord