Я хочу, чтобы мое приложение WPF открывало браузер по умолчанию и переходило на определенную веб-страницу. Как я могу это сделать?
Я хочу, чтобы мое приложение WPF открывало браузер по умолчанию и переходило на определенную веб-страницу. Как я могу это сделать?
Ответы:
System.Diagnostics.Process.Start("http://www.webpage.com");
Один из многих способов.
Принятый ответ больше не работает в .NET Core 3 . Чтобы он заработал, воспользуйтесь следующим методом:
var psi = new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
};
Process.Start (psi);
Хотя был дан хороший ответ (с использованием Process.Start), безопаснее инкапсулировать его в функцию, которая проверяет, действительно ли переданная строка является URI, чтобы избежать случайного запуска случайных процессов на машине.
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 объясняет это в статье KB305703 о том, как программно запустить Интернет-браузер по умолчанию с помощью Visual C # .
Не забудьте проверить раздел «Устранение неполадок».
Вы не можете запустить веб-страницу из приложения с повышенными привилегиями. Это вызовет исключение 0x800004005, вероятно, потому, что explorer.exe и браузер работают без повышенных прав.
Чтобы запустить веб-страницу из приложения с повышенными правами в браузере без повышенных прав, используйте код, созданный Майком Фэном . Я попытался передать URL-адрес lpApplicationName, но это не сработало. Также не когда я использую CreateProcessWithTokenW с lpApplicationName = "explorer.exe" (или iexplore.exe) и lpCommandLine = url.
Следующее обходное решение действительно работает: Создайте небольшой EXE-проект с одной задачей: Process.Start (url), используйте CreateProcessWithTokenW для запуска этого .EXE. На моем Windows 8 RC это работает нормально и открывает веб-страницу в Google Chrome.
Explorer.exeдля понижения уровня не поддерживается: «К сожалению, команда Windows Shell ответила, что текущее поведение« Explorer.exe AppName.exe »является ошибкой и может не работать в будущих обновлениях / версиях Windows. Приложения не следует полагаться на это ".
Вот мой полный код, как открыть.
есть 2 варианта:
открыть в браузере по умолчанию (поведение похоже на открытие в окне браузера)
открыть с помощью параметров команды по умолчанию (поведение похоже на использование команды "RUN.EXE")
открыть через `` проводник '' (поведение похоже на то, что вы написали URL-адрес внутри URL-адреса окна папки)
[необязательное предложение] 4. Используйте местоположение процесса iexplore, чтобы открыть требуемый URL
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;
}
Надеюсь, я помог.
GetWindowsPath?
Старая школа;)
public static void openit(string x) {
System.Diagnostics.Process.Start("cmd", "/C start" + " " + x);
}
Использование: openit("www.google.com");
У меня есть решение, потому что сегодня у меня похожая проблема.
Предположим, вы хотите открыть http://google.com из приложения, работающего с правами администратора:
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo);