Как открыть веб-страницу из моего приложения?

126

Я хочу, чтобы мое приложение WPF открывало браузер по умолчанию и переходило на определенную веб-страницу. Как я могу это сделать?

Алексей Бараноски
источник

Ответы:

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

Один из многих способов.

Инишир
источник
3
Я тоже использовал это, но теперь оказалось, что это не работает с UAC. В моем приложении это указано в манифесте <requestExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Когда я запускаю приложение под Windows 8 (где вы больше не можете отключить UAC), я получаю следующее исключение при открытии веб-страницы : Win32Exception (0x80004005): Класс не зарегистрирован в System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer
Этого эффекта не будет, если я изменю requireAdministrator на asInvoker. Но тогда приложение не повышается :-(
lvmeijer
4
Это может открыть довольно большую дыру в безопасности вашего приложения, если вы случайно получите URL-адрес из пользовательского ввода и не подтвердите, что это URI. Затем они могут запустить любое приложение в вашей системе.
cdiggins
1
К вашему сведению: работает в Unity, Mono, на Os X и Windows. В iOS не работает. Остальные я не проверял.
Grant M
2
Как насчет открытия локального файла HTML?
guogangj
34

Я использовал эту строку для запуска браузера по умолчанию:

System.Diagnostics.Process.Start("http://www.google.com"); 
ajma
источник
1
Этот ответ - дубликат.
MAXE
1
@MAXE Два ответа были созданы за одну минуту.
4424dev
20

Принятый ответ больше не работает в .NET Core 3 . Чтобы он заработал, воспользуйтесь следующим методом:

var psi = new ProcessStartInfo
{
    FileName = url,
    UseShellExecute = true
};
Process.Start (psi);
Александр Смирнов
источник
19

Хотя был дан хороший ответ (с использованием 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;
}
cdiggins
источник
6

Вы не можете запустить веб-страницу из приложения с повышенными привилегиями. Это вызовет исключение 0x800004005, вероятно, потому, что explorer.exe и браузер работают без повышенных прав.

Чтобы запустить веб-страницу из приложения с повышенными правами в браузере без повышенных прав, используйте код, созданный Майком Фэном . Я попытался передать URL-адрес lpApplicationName, но это не сработало. Также не когда я использую CreateProcessWithTokenW с lpApplicationName = "explorer.exe" (или iexplore.exe) и lpCommandLine = url.

Следующее обходное решение действительно работает: Создайте небольшой EXE-проект с одной задачей: Process.Start (url), используйте CreateProcessWithTokenW для запуска этого .EXE. На моем Windows 8 RC это работает нормально и открывает веб-страницу в Google Chrome.

lvmeijer
источник
1
См. Комментарий , использование Explorer.exeдля понижения уровня не поддерживается: «К сожалению, команда Windows Shell ответила, что текущее поведение« Explorer.exe AppName.exe »является ошибкой и может не работать в будущих обновлениях / версиях Windows. Приложения не следует полагаться на это ".
Карл Уолш
4

Вот мой полный код, как открыть.

есть 2 варианта:

  1. открыть в браузере по умолчанию (поведение похоже на открытие в окне браузера)

  2. открыть с помощью параметров команды по умолчанию (поведение похоже на использование команды "RUN.EXE")

  3. открыть через `` проводник '' (поведение похоже на то, что вы написали 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;
    }

Надеюсь, я помог.

mr.baby123
источник
3
Что меня интересует ... зачем усложнять это, когда разные люди уже сделали это до смерти простым, чтобы ответить на вопрос?
CularBytes
Почему бы просто не использовать SearchPath вместо своего собственного GetWindowsPath?
ub3rst4r
3
Почему пустые блоки catch? Разве это не плохая идея - просто проглатывать исключения?
регги-гитара
3

Старая школа;)

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

Использование: openit("www.google.com");

Moh.Kirkuk
источник
2

У меня есть решение, потому что сегодня у меня похожая проблема.

Предположим, вы хотите открыть http://google.com из приложения, работающего с правами администратора:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 
winsetter
источник
1
какие ссылки / пространства имен я должен использовать для этого решения?
ИзощреннаяОтмена
1
@SophisticatedUndoing Я считаю, что ProcessStartInfo и Process находятся в System.Diagnostics
Фрэнсис Лорд