Voglio che la mia applicazione WPF apra il browser predefinito e vada a una determinata pagina web. Come lo faccio?
Voglio che la mia applicazione WPF apra il browser predefinito e vada a una determinata pagina web. Come lo faccio?
Risposte:
System.Diagnostics.Process.Start("http://www.webpage.com");
Uno dei tanti modi.
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);
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;
}
Microsoft lo spiega nell'articolo KB305703 su come avviare il browser Internet predefinito a livello di programmazione utilizzando Visual C # .
Non dimenticare di controllare la sezione Risoluzione dei problemi.
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.
Explorer.exe
per 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. "
Ecco il mio codice completo come aprire.
ci sono 2 opzioni:
aprire utilizzando il browser predefinito (il comportamento è come se si aprisse nella finestra del browser)
si apre tramite le opzioni di comando predefinite (il comportamento è come se si usasse il comando "RUN.EXE")
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
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;
}
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.
GetWindowsPath
?
Alla vecchia maniera;)
public static void openit(string x) {
System.Diagnostics.Process.Start("cmd", "/C start" + " " + x);
}
Uso: openit("www.google.com");
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);