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


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"); 

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


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.


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

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


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");


2

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

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

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

1
какие ссылки / пространства имен я должен использовать для этого решения?
— ИзощреннаяОтмена

1
@SophisticatedUndoing Я считаю, что ProcessStartInfo и Process находятся в System.Diagnostics
— Фрэнсис Лорд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.