Desejo que meu aplicativo WPF abra o navegador padrão e vá para uma determinada página da web. Como faço isso?
Desejo que meu aplicativo WPF abra o navegador padrão e vá para uma determinada página da web. Como faço isso?
Respostas:
System.Diagnostics.Process.Start("http://www.webpage.com");
Uma de muitas maneiras.
Eu tenho usado esta linha para iniciar o navegador padrão:
System.Diagnostics.Process.Start("http://www.google.com");
A resposta aceita não funciona mais no .NET Core 3 . Para fazê-lo funcionar, use o seguinte método:
var psi = new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
};
Process.Start (psi);
Embora tenha sido dada uma boa resposta (usando Process.Start
), é mais seguro encapsulá-la em uma função que verifica se a sequência passada é realmente um URI, para evitar iniciar acidentalmente processos aleatórios na máquina.
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;
}
A Microsoft explica no artigo KB305703 sobre Como iniciar o navegador da Internet padrão programaticamente usando o Visual C # .
Não se esqueça de verificar a seção Solução de problemas.
Você não pode iniciar uma página da web a partir de um aplicativo elevado. Isso gerará uma exceção 0x800004005, provavelmente porque o explorer.exe e o navegador não estão sendo elevados.
Para iniciar uma página da Web a partir de um aplicativo elevado em um navegador não elevado, use o código criado por Mike Feng . Tentei passar o URL para lpApplicationName, mas isso não funcionou. Também não quando eu uso CreateProcessWithTokenW com lpApplicationName = "explorer.exe" (ou seja, xexplore.exe) e lpCommandLine = url.
A seguinte solução alternativa funciona: Crie um pequeno projeto EXE que tenha uma tarefa: Process.Start (url), use CreateProcessWithTokenW para executar este .EXE. No meu Windows 8 RC, isso funciona bem e abre a página da web no Google Chrome.
Explorer.exe
: não é possível usar o comando para remover a elevação: "Infelizmente, a equipe do Windows Shell respondeu que o comportamento atual de" Explorer.exe AppName.exe "é um bug e pode não funcionar em futuras atualizações / versões do Windows. Aplicativos não deve confiar nele. "
Aqui está o meu código completo de como abrir.
existem 2 opções:
abrir usando o navegador padrão (o comportamento é como o aberto dentro da janela do navegador)
aberto através das opções de comando padrão (o comportamento é como você usa o comando "RUN.EXE")
aberto através do 'explorer' (o comportamento é como o que você escreveu na URL da janela da pasta)
[sugestão opcional] 4. use o local do processo iexplore para abrir o URL necessário
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;
}
Espero ter ajudado.
GetWindowsPath
?
O jeito da velha escola;)
public static void openit(string x) {
System.Diagnostics.Process.Start("cmd", "/C start" + " " + x);
}
Usar: openit("www.google.com");
Eu tenho a solução para isso devido a um problema semelhante hoje.
Suponha que você queira abrir http://google.com a partir de um aplicativo em execução com privilégios de administrador:
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo);