Як відкрити веб-сторінку з моєї програми?


126

Я хочу змусити свою програму WPF відкрити браузер за замовчуванням і перейти на певну веб-сторінку. Як це зробити?

Відповіді:


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

Один із багатьох способів.


3
Я також цим користувався, але тепер виявляється, що це не працює з UAC. У своїй програмі я маю це в маніфесті <requestExecutionLevel level = "RequAdministrator" uiAccess = "false" /> Коли я запускаю програму під Windows 8 (де ви більше не можете відключити UAC), я отримую таке виняток, коли відкриваю веб-сторінку : Win32Exception (0x80004005): Клас не зареєстрований у System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer

Цей ефект не відбудеться, коли я зміню на вимогуAdAdvorator на AsInvoker Але тоді додаток не підвищено :-(
lvmeijer

4
Це може відкрити досить велику дірку в безпеці у вашій програмі, якщо ви випадково отримаєте URL-адресу від введення користувача, а не підтвердите, що це URI. Потім вони можуть запустити будь-яку програму, яку хочуть у вашій системі.
cdiggins

1
FYI: працює в Unity, Mono, на OS X і Windows. Це не працює в iOS. Я не перевіряв інших.
Грант М

2
Як щодо відкриття локального html-файлу?
guogangj

34

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

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

1
Ця відповідь є дублікатом.
МАКСЕ

1
@MAXE Два відповіді були створені в одну і ту ж хвилину.
4424дев

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. відкрити через "Explorer" (поведінка така, як ви написали 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;
    }

і функція Helper:

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
Чому порожні блоки лову? Чи не погана ідея просто ковтати винятки?
reggaeguitar

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
Francis Lord
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.