Come aprire una pagina web dalla mia applicazione?


126

Voglio che la mia applicazione WPF apra il browser predefinito e vada a una determinata pagina web. Come lo faccio?

Risposte:


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

Uno dei tanti modi.


3
Ho usato anche questo, ma ora risulta che non funziona con l'UAC. Nella mia applicazione ho questo nel manifest <requestExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Quando eseguo l'app in Windows 8 (dove non è più possibile disabilitare l'UAC), ottengo la seguente eccezione all'apertura di una pagina web : Win32Exception (0x80004005): Classe non registrata in System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer

Questo effetto non si verificherà quando cambio requireAdministrator in asInvoker. Ma poi l'app non è elevata :-(
lvmeijer

4
Ciò potrebbe aprire un buco di sicurezza piuttosto grande nella tua applicazione se dovessi ottenere accidentalmente l'URL dall'input dell'utente e non convalidare che si tratta di un URI. Possono quindi avviare qualsiasi applicazione desiderano sul tuo sistema.
cdiggins

1
FYI: funziona in Unity, Mono, su Os X e Windows. Non funziona in iOS. Non ho testato gli altri.
Grant M

2
Che ne dici di aprire un file html locale?
guogangj

34

Ho utilizzato questa riga per avviare il browser predefinito:

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

1
Questa risposta è un duplicato.
MAXE

1
@MAXE Le due risposte sono state create nello stesso minuto.
4424dev

20

La risposta accettata non funziona più su .NET Core 3 . Per farlo funzionare, usa il seguente metodo:

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

19

Sebbene sia stata data una buona risposta (utilizzando Process.Start), è più sicuro incapsularla in una funzione che controlla che la stringa passata sia effettivamente un URI, per evitare l'avvio accidentale di processi casuali sulla macchina.

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

Non è possibile avviare una pagina Web da un'applicazione con privilegi elevati. Ciò genererà un'eccezione 0x800004005, probabilmente perché explorer.exe e il browser sono in esecuzione non con privilegi elevati.

Per avviare una pagina Web da un'applicazione con privilegi elevati in un browser Web non elevato, utilizzare il codice creato da Mike Feng . Ho provato a passare l'URL a lpApplicationName ma non ha funzionato. Inoltre non quando utilizzo CreateProcessWithTokenW con lpApplicationName = "explorer.exe" (o iexplore.exe) e lpCommandLine = url.

La seguente soluzione alternativa funziona: creare un piccolo progetto EXE con un'attività: Process.Start (url), utilizzare CreateProcessWithTokenW per eseguire questo .EXE. Sul mio Windows 8 RC funziona bene e apre la pagina web in Google Chrome.


1
Vedere il commento , l'utilizzo Explorer.exeper l'annullamento dell'elevazione non è supportato: "Sfortunatamente, il team di Windows Shell ha risposto che il comportamento corrente di" Explorer.exe AppName.exe "è un bug e potrebbe non funzionare nei futuri aggiornamenti / versioni di Windows. Applicazioni non dovrebbe fare affidamento su di esso. "
Carl Walsh

4

Ecco il mio codice completo come aprire.

ci sono 2 opzioni:

  1. aprire utilizzando il browser predefinito (il comportamento è come se si aprisse nella finestra del browser)

  2. si apre tramite le opzioni di comando predefinite (il comportamento è come se si usasse il comando "RUN.EXE")

  3. aprire tramite 'explorer' (il comportamento è come se avessi scritto l'URL all'interno dell'URL della finestra della cartella)

[suggerimento opzionale] 4. utilizzare il percorso del processo iexplore per aprire l'URL richiesto

CODICE:

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

e la funzione Helper:

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

Spero di aver aiutato.


3
Quello che mi chiedo è .. perché renderlo così complicato quando varie persone hanno reso estremamente semplice rispondere alla domanda già?
CularBytes

Perché non usare solo SearchPath invece del tuo GetWindowsPath?
ub3rst4r

3
Perché vuotare i blocchi di cattura? Non è una cattiva idea inghiottire solo le eccezioni?
reggaeguitar

3

Alla vecchia maniera;)

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

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


2

Ho la soluzione per questo perché oggi ho un problema simile.

Supponi di voler aprire http://google.com da un'app in esecuzione con privilegi di amministratore:

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

1
quali riferimenti / spazi dei nomi dovrei usare per questa soluzione?
SophisticatedUndoing

1
@SophisticatedUndoing Credo che ProcessStartInfo e Process si trovino in System.Diagnostics
Francis Lord,
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.