Jak otworzyć stronę internetową z mojej aplikacji?


126

Chcę, aby moja aplikacja WPF otwierała domyślną przeglądarkę i przechodziła do określonej strony internetowej. W jaki sposób mogę to zrobić?

Odpowiedzi:


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

Jeden z wielu sposobów.


3
Ja też tego użyłem, ale teraz okazuje się, że to nie działa z UAC. W mojej aplikacji mam to w manifeście <requestExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Kiedy uruchamiam aplikację pod Windows 8 (gdzie nie można już wyłączyć UAC), pojawia się następujący wyjątek podczas otwierania strony internetowej : Win32Exception (0x80004005): Klasa niezarejestrowana w System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer

Ten efekt nie wystąpi, gdy zmienię requireAdministrator na asInvoker. Ale wtedy aplikacja nie jest podniesiona :-(
lvmeijer,

4
Może to otworzyć całkiem dużą lukę w zabezpieczeniach aplikacji, jeśli przypadkowo uzyskasz adres URL z danych wejściowych użytkownika i nie sprawdzisz, czy jest to identyfikator URI. Następnie mogą uruchomić dowolną aplikację w systemie.
cdiggins

1
FYI: działa w Unity, Mono, na OS X i Windows. Nie działa w iOS. Nie testowałem pozostałych.
Grant M

2
Co powiesz na otwarcie lokalnego pliku html?
guogangj

34

Użyłem tej linii do uruchomienia domyślnej przeglądarki:

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

1
Ta odpowiedź jest duplikatem.
MAXE

1
@MAXE Dwie odpowiedzi zostały utworzone w tej samej minucie.
4424dev

20

Zaakceptowana odpowiedź nie działa już w .NET Core 3 . Aby to zadziałało, użyj następującej metody:

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

19

Chociaż podano dobrą odpowiedź (używając Process.Start), bezpieczniej jest zamknąć ją w funkcji, która sprawdza, czy przekazany ciąg jest rzeczywiście identyfikatorem URI, aby uniknąć przypadkowego uruchomienia przypadkowych procesów na maszynie.

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


6

Nie można uruchomić strony internetowej z poziomu aplikacji. Spowoduje to zgłoszenie wyjątku 0x800004005, prawdopodobnie dlatego, że program explorer.exe i przeglądarka nie mają podwyższonego poziomu uprawnień.

Aby uruchomić stronę internetową z aplikacji z podwyższonym poziomem uprawnień w przeglądarce internetowej bez uprawnień, użyj kodu stworzonego przez Mike'a Fenga . Próbowałem przekazać adres URL do lpApplicationName, ale to nie zadziałało. Również nie wtedy, gdy używam CreateProcessWithTokenW z lpApplicationName = "explorer.exe" (lub iexplore.exe) i lpCommandLine = url.

Następujące obejście działa: Utwórz mały projekt EXE, który ma jedno zadanie: Process.Start (url), użyj CreateProcessWithTokenW, aby uruchomić ten plik .EXE. Na moim Windows 8 RC to działa dobrze i otwiera stronę internetową w Google Chrome.


1
Zobacz komentarz , używanie Explorer.exedo obniżania uprawnień nie jest obsługiwane: „Niestety, zespół Windows Shell odpowiedział, że obecne zachowanie programu„ Explorer.exe AppName.exe ”jest błędem i może nie działać w przyszłych aktualizacjach / wersjach systemu Windows. Aplikacje nie powinni na nim polegać ”.
Carl Walsh

4

Oto mój kompletny kod, jak otworzyć.

istnieją 2 opcje:

  1. otwórz za pomocą domyślnej przeglądarki (zachowanie jest podobne do otwierania w oknie przeglądarki)

  2. otwórz za pomocą domyślnych opcji poleceń (zachowanie jest podobne do polecenia „RUN.EXE”)

  3. otwórz za pomocą `` eksploratora '' (zachowanie jest takie, jak w przypadku wpisania adresu URL w adresie URL okna folderu)

[sugestia opcjonalna] 4. Użyj lokalizacji procesu iexplore, aby otworzyć wymagany adres URL

KOD:

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

oraz funkcja pomocnika:

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

Mam nadzieję, że pomogłem.


3
Zastanawiam się… po co komplikować sprawę, skoro wielu ludzi sprawiło, że odpowiedź na to pytanie była śmiertelnie prosta?
CularBytes

Dlaczego po prostu nie użyć SearchPath zamiast własnego GetWindowsPath?
ub3rst4r

3
Dlaczego puste bloki catch? Czy nie jest złym pomysłem połykanie wyjątków?
reggaeguitar

3

Stara szkoła;)

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

Posługiwać się: openit("www.google.com");


2

Mam na to rozwiązanie, bo mam dziś podobny problem.

Załóżmy, że chcesz otworzyć http://google.com z aplikacji działającej z uprawnieniami administratora:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 

1
które odwołania / przestrzenie nazw powinienem używać w tym rozwiązaniu?
SophisticatedUndoing

1
@SophisticatedUndoing Wierzę, że ProcessStartInfo i Process znajdują się w System.Diagnostics
Francis Lord
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.