Як відкрити браузер за замовчуванням у C #


257

Я розробляю невелику програму C # і в ній є веб-браузер. В даний час у мене на комп’ютері всі мої настройки за замовчуванням: Google Chrome є моїм браузером за замовчуванням, але коли я натискаю посилання в моїй програмі, щоб відкрити в новому вікні, це відкриває Internet Explorer. Чи є можливість замість цього посилання відкритись у браузері за замовчуванням? Або в моєму комп’ютері щось не так?

Моя проблема полягає в тому, що у мене в веб-програмі є веб-браузер, тому скажіть, що ви переходите в Google і набираєте "переповнення стека" і клацніть правою кнопкою миші перше посилання та натискаєте "Відкрити в новому вікні", вона відкриється в IE замість Chrome. Це щось я неправильно зашифрував, чи на моєму комп’ютері встановлено неправильне налаштування

=== EDIT ===

Це справді дратує. Я вже знаю, що браузер - IE, але я раніше працював. Коли я натиснув посилання, воно відкрилося в хромі. Я використовував різкі розробки, щоб зробити програму в той час, тому що не міг отримати c # express для запуску. Я зробив свіжу установку Windows, і оскільки я не був надто далеко у своїй заявці, я вирішив почати спочатку, і тепер у мене виникає ця проблема. Ось чому я не впевнений, це мій комп’ютер чи ні. Навіщо IE запускати весь браузер, коли натискається посилання, а не просто відкривати нове посилання в браузері за замовчуванням?


Хе-хе, переконати IE відкрити Chrome для вас буде трохи важкою битвою. Ну, ні трохи. Це не працює, якщо ви запускаєте IE безпосередньо. Або Chrome для цього питання, якщо IE є типовим.
Ганс Пасант

@SLaks Mono? Про що ти говориш?
Шон

1) getstartMenuDir Пошук для Firefox або Chrome StandartName Besure. якщо не знайдено 2) отримати список стандартних місць встановлення, які коли-небудь існували 32 64 хромовані ff, які використовують це. якщо не 3) в крайньому випадку використовуйте відповіді.
bh_earth0

Відповіді:


505

Можна просто написати

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

EDIT : WebBrowserКонтроль - це вбудована копія IE.
Тому будь-які посилання всередині нього відкриються в IE.

Щоб змінити таку поведінку, ви можете впоратися з Navigatingподією.


1
Спробуй це. Використовуйте Taskmgr.exe, ви побачите дві копії iexporer.exe. Навігація не спрацьовує для запущеної.
Ганс Пасант

4
@Sean: Так. Process.Start(e.Url.ToString())
СЛак

2
Локальний URL (файл: ///) не працює з рядком запитів, якщо exe браузера не вказано як перший парам.
HerrimanCoder

2
Будьте в курсі, що цей метод може також ввести проблему безпеки, оскільки, якщо "URL" буде замінено фізичним шляхом до програми, він також виконається
Геррі Преторіус

1
@Spencer: переконайтеся, що URL-адреса довірена.
СЛАкс

45

Для тих, хто знаходить це питання в ядрі dotnet. Я знайшов тут рішення

Код:

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

@Equiman не робить це? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)чи це вже буде правдою в Linux?
Джоел Харкес

Я зробив це. Але xdg-commandповертає "xdg-open: команда не знайдена". Потім я перевірив openкоманду і працює.
еквіман

@Equiman, так що ви говорите, я повинен переключити elseif Linux і OSX, щоб він працював, або macos не потрапляє udner OSX?
Джоель Харкес

1
Я думаю, що ні ... моє рішення є якоюсь альтернативою.
еквіман

38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

це повинно вирішити вашу проблему


7
має бути "статичним недійсним 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);
}

1
UseShellExecuteза замовчуванням до істинного.
СЛАкс

4
@SLaks, спасибі З іншого боку, важливо згадати, що це має бути true.
Андреас

1
Для тих, хто лінивий перевірити ... Процес вимагає "використання System.Diagnostics"
Нік Робертс

Мабуть, це маршрут, необхідний WPF. Якщо ви просто зробите Process.Start(url)це, воно не відкриє нове вікно браузера.
RubyHaus

5

Погляньте на контроль GeckoFX .

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


Моя проблема полягає в тому, що у мене в веб-програмі є веб-браузер, тому скажіть, що ви переходите в Google і набираєте "переповнення стека" і клацніть правою кнопкою миші перше посилання та натискаєте "Відкрити в новому вікні", вона відкриється в IE замість Chrome. Це щось я неправильно зашифрував, чи є на моєму комп’ютері налаштування невірно
Sean

@SLaks: Чому ти це кажеш? Я не вірю, що взагалі важко написати створення рядка та встановити його рівним GetDefaultBrowserPath ().
ДОКТОР

@Sean: Якщо у вашій програмі є веб-браузер, він за замовчуванням використовує IE. Навігаційна подія може допомогти вам обійти це.
ДОКТОР

Я змінив свою відповідь, зрозумівши, що ОП не бажає змінювати браузер за замовчуванням, запущений окремим процесом.
ДОКТОР

5

Спробуйте це, старий шкільний спосіб;)

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

використовуючи: openit ("www.google.com");


2
Не можна цього експлуатувати, ала, "Шеллсок"?
Джозеф Леннокс

@JosephLennox - це прекрасний момент! напевно, варто згадати, що System.Diagnostics.Process.Start безпосередньо за URL-адресою не набагато безпечніший! з іншого боку, якщо користувач запускає вашу програму на своєму комп’ютері (вони, мабуть, є), найгірше, що вони можуть зробити, - це зламати власну систему: P
Ben

4
@Ben Залежить від того, звідки береться вхід. Якщо це загальнодоступне джерело даних, колись користувач може ввести шкідливу команду, а всі інші користувачі, які натискають кнопку "Перейти", були б на милість цього користувача.
Ден Бешард

4

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

2. Вона буде працювати, але заблокує нове відкриття вікна, якщо браузер за замовчуванням є хромованим

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

Чи є пакет, який ви використовуєте, що надає 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"));

Це Launcher.LaunchUriAsync . Перейдіть за посиланням для повного прикладу. Цікаво, що повернене значення дозволяє абоненту дізнатися, відкрилася чи ні URL-адреса. Обережно, це для Windows 8 / Server2012 / Phone8 і вище. Якщо програмне забезпечення повинно бути сумісним із старими версіями, воно не може ним користуватися.
Стефан Гурішон


0

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