Как открыть браузер по умолчанию в C #

259

Я разрабатываю небольшое приложение на C # и в нем есть веб-браузер. В настоящее время все настройки по умолчанию на моем компьютере говорят, что Google Chrome - это браузер по умолчанию, но когда я нажимаю ссылку в своем приложении, чтобы открыть в новом окне, он открывает Internet Explorer. Есть ли способ сделать эти ссылки открытыми в браузере по умолчанию? Или что-то не так на моем компьютере?

Моя проблема в том, что у меня есть веб-браузер в приложении, так что вы, например, заходите в Google и вводите «переполнение стека», нажимаете правой кнопкой мыши первую ссылку и нажимаете «Открыть в новом окне», она открывается в IE вместо Chrome. Это то, что я неправильно закодировал, или на моем компьютере неверные настройки

=== РЕДАКТИРОВАТЬ ===

Это действительно раздражает. Я уже знаю, что браузер IE, но у меня раньше он работал нормально. Когда я нажал на ссылку, она открылась в Chrome. Я использовал Sharp Develop для создания приложения в то время, потому что я не мог получить C # Express для запуска. Я сделал новую установку Windows, и поскольку я не слишком далеко продвинулся в своем приложении, я решил начать все сначала, и теперь у меня возникла эта проблема. Вот почему я не уверен, если это мой компьютер или нет. Почему IE запускает весь браузер при нажатии на ссылку, а не просто открывает новую ссылку в браузере по умолчанию?

Шон
источник
Хе-хе, убедить IE открыть Chrome для вас будет непростой битвой. Ну, не немного. Это также не работает, если вы запускаете IE напрямую. Или Chrome в этом отношении, если IE по умолчанию.
Ганс Пассант
@ Слакс Моно? О чем ты говоришь?
Шон
1) getstartMenuDir Поиск Firefox или Chrome StandartName Besure. если не найден 2) получить список стандартных мест установки, которые когда-либо существуют. если нет 3) в крайнем случае используйте ответы.
bh_earth0

Ответы:

506

Вы можете просто написать

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

РЕДАКТИРОВАТЬ : WebBrowserэлемент управления является встроенной копией IE.
Поэтому любые ссылки внутри него будут открываться в IE.

Чтобы изменить это поведение, вы можете обработать Navigatingсобытие.

SLaks
источник
1
Попытайся. Используйте Taskmgr.exe, вы увидите две запущенные копии iexporer.exe. Навигация не срабатывает для внепроцессного.
Ганс Пассант
4
@Sean: да. Process.Start(e.Url.ToString())
Утром
2
Локальный URL (file: ///) не работает со строкой запроса, если в качестве первого параметра не указан exe-браузер.
HerrimanCoder
2
Имейте в виду, что этот метод может также создать проблему безопасности, поскольку, если вместо URL-
Джерри Преториус
1
@ Спенсер: убедитесь, что URL является доверенным.
Утром
45

Для тех, кто нашел этот вопрос в дотнет ядре. Я нашел решение здесь

Код:

private void OpenUrl(string url)
{
    try
    {
        Process.Start(url);
    }
    catch
    {
        // hack because of this: https://github.com/dotnet/corefx/issues/10361
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            url = url.Replace("&", "^&");
            Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            Process.Start("xdg-open", url);
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            Process.Start("open", url);
        }
        else
        {
            throw;
        }
    }
}
Джоэл Харкс
источник
Спасибо! у меня работает ... но в macos с openкомандой вместоxdg-open
equiman
@ Эквайман не делает этого? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)или это уже будет верно в Linux?
Джоэл Харкс
Я это сделал. Но xdg-commandвозвращает «xdg-open: команда не найдена». Затем я проверил с openкомандой и работает.
Эквиман
@ Equiman, так что вы говорите, что я должен переключить elseif linux и OSX, чтобы заставить его работать, или Macos не падает на OSX?
Джоэл Харкс
1
Я думаю нет ... мое решение является своего рода альтернативой.
Эквиман
38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

это должно решить вашу проблему

user2193090
источник
7
должно быть «static void GotoSite»
Behrooz
15

Вы пробовали, Processкак упомянуто здесь: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Вы могли бы использовать

Process myProcess = new Process();

try
{
    // true is the default, but it is important not to set it to false
    myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
Andreas
источник
1
UseShellExecuteпо умолчанию true.
Утром
4
@ СЛакс, спасибо. С другой стороны важно упомянуть, что так и должно быть true.
Андреас
1
Для тех, кому лень проверять ... Процесс требует "использования System.Diagnostics"
Ник Робертс
Похоже, это маршрут, требуемый WPF. Если вы просто сделаете это Process.Start(url), он не откроет новое окно браузера.
RubyHaus
5

Посмотрите на элемент управления GeckoFX .

GeckoFX - это компонент с открытым исходным кодом, который позволяет легко встраивать Mozilla Gecko (Firefox) в любое приложение .NET Windows Forms. Написанный на чистом, полностью прокомментированном C #, GeckoFX является идеальной заменой стандартного элемента управления WebBrowser на основе Internet Explorer.

ДОКТОР
источник
Моя проблема в том, что у меня есть веб-браузер в приложении, так что вы можете зайти в Google и ввести «переполнение стека», щелкнуть правой кнопкой мыши первую ссылку и нажать «Открыть в новом окне», она открывается в IE вместо Chrome. Это то, что я неправильно запрограммировал, или на моем компьютере установлена ​​неправильная настройка
Шон
@SLaks: Почему ты так говоришь? Я не верю, что вообще сложно написать, создать строку и установить ее равной GetDefaultBrowserPath ().
ДОКТОР
@Sean: если в вашем приложении есть веб-браузер, то по умолчанию оно будет использовать IE. Событие Navigating может помочь вам обойти это.
ДОКТОР
Я изменил свой ответ после того, как понял, что OP не хочет менять браузер по умолчанию, запущенный отдельным процессом.
ДОКТОР
5

Попробуйте это, по-старому, школьный путь;)

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

используя: openit ("www.google.com");

Moh.Kirkuk
источник
2
Разве это не может быть использовано, аля, "Shellsock"?
Джозеф Леннокс
@JosephLennox, это отличный момент! вероятно, стоит упомянуть, что System.Diagnostics.Process.Start в URL напрямую не намного (вообще?) безопаснее! с другой стороны, если пользователь запускает ваше приложение на своем компьютере (вероятно, так оно и есть), худшее, что он может сделать, это сломать свою собственную систему: P
Бен,
4
@Ben Зависит от того, откуда поступает информация. Если это общий источник данных, один раз пользователь может ввести вредоносную команду, и все остальные пользователи, которые нажмут кнопку «Перейти», окажутся в зависимости от этого пользователя.
Дэн Бешард
5

После многих исследований я чувствую, что большинство из приведенных ответов не будут работать с ядром dotnet. 1 System.Diagnostics.Process.Start("http://google.com").; - не будет работать с ядром dotnet

2.Он будет работать, но заблокирует открытие нового окна в случае, если браузером по умолчанию является Chrome

 myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();

Ниже приведен самый простой и будет работать во всех сценариях.

Process.Start("explorer", url);
Майянк Трипати
источник
Это решило это для меня.
Rufw91
3

Это открыло по умолчанию для меня:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Xero Phane
источник
Есть ли пакет, который вы используете, который дает EventArgs свойство LinkText?
Ник Робертс
3

dotnet coreвыдает ошибку, если мы используем Process.Start(URL). Следующий код будет работать в dotnet core. Вы можете добавить любой браузер вместо Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);
Натараджан Ганапати
источник
3
Не ответ на вопрос, код не знает, какой браузер по умолчанию
Arjan
0

В UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Kibernetik
источник
Это Launcher.LaunchUriAsync . Перейдите по ссылке для полного примера. Интересно, что возвращаемое значение позволяет вызывающей стороне знать, был ли открыт URL или нет. Осторожно, это для Windows 8 / Server2012 / Phone8 и выше. Если программное обеспечение должно быть совместимо со старыми версиями, оно не может использовать это.
Стефан Гурихон
0

Открыть динамически

string addres= "Print/" + Id + ".htm";
           System.Diagnostics.Process.Start(Path.Combine(Environment.CurrentDirectory, addres));
سیدرسول میرعظیمی
источник
0

обновить реестр текущей версией проводника
@ "Программное обеспечение \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION"

public enum BrowserEmulationVersion
{
    Default = 0,
    Version7 = 7000,
    Version8 = 8000,
    Version8Standards = 8888,
    Version9 = 9000,
    Version9Standards = 9999,
    Version10 = 10000,
    Version10Standards = 10001,
    Version11 = 11000,
    Version11Edge = 11001
}

key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
dfgv
источник