Jak otworzyć w domyślnej przeglądarce w C #

257

Projektuję małą aplikację w języku C # i jest w niej przeglądarka internetowa. Obecnie mam wszystkie ustawienia domyślne na moim komputerze, mówiąc, że Google Chrome jest moją domyślną przeglądarką, ale kiedy kliknę link w mojej aplikacji, aby otworzyć w nowym oknie, otworzy się przeglądarka internetowa. Czy istnieje sposób, aby zamiast tego te linki były otwarte w domyślnej przeglądarce? Czy coś jest nie tak na moim komputerze?

Mój problem polega na tym, że mam przeglądarkę internetową w aplikacji, więc powiedz, że idziesz do Google i wpisujesz „przepełnienie stosu” i kliknij prawym przyciskiem myszy pierwszy link i kliknij „Otwórz w nowym oknie”, otwiera się w IE zamiast Chrome. Czy to jest coś, co kodowałem niepoprawnie, czy jest to ustawienie niepoprawne na moim komputerze

=== EDYCJA ===

To jest naprawdę denerwujące. Wiem już, że przeglądarka to IE, ale wcześniej działało dobrze. Kiedy kliknąłem link, otworzył się w chromie. W tym czasie używałem programu Sharp do tworzenia aplikacji, ponieważ nie mogłem uruchomić c # express do uruchomienia. Zrobiłem nową instalację systemu Windows i ponieważ nie byłem zbyt daleko w mojej aplikacji, postanowiłem zacząć od nowa, a teraz mam ten problem. Dlatego nie jestem pewien, czy to mój komputer, czy nie. Dlaczego IE miałby uruchamiać całą przeglądarkę po kliknięciu linku zamiast po prostu otwierać nowy link w domyślnej przeglądarce?

Sean
źródło
Hehe, przekonanie IE, by otworzył dla ciebie Chrome, będzie bitwą pod górę. Cóż, ani trochę. To nie działa również, jeśli uruchamiasz IE bezpośrednio. Lub Chrome w tym przypadku, jeśli IE jest domyślny.
Hans Passant
@SLaks Mono? O czym mówisz?
Sean
1) getstartMenuDir Wyszukaj Firefox lub Chrome StandartName Besure. jeśli nie znaleziono. 2) Uzyskaj listę standardowych lokalizacji instalacji, które kiedykolwiek istnieją 32 64 chrome ff używają tego. jeśli nie 3) skorzystaj z ostatecznych odpowiedzi.
bh_earth0

Odpowiedzi:

505

Możesz po prostu pisać

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

EDYCJA :WebBrowser formant jest osadzoną kopią IE.
Dlatego wszelkie zawarte w nim linki będą otwierane w IE.

Aby zmienić to zachowanie, możesz obsłużyć Navigatingzdarzenie.

SLaks
źródło
1
Spróbuj. Użyj Taskmgr.exe, zobaczysz uruchomione dwie kopie iexporer.exe. Nawigacja nie działa w przypadku procesu poza procesem.
Hans Passant
4
@Sean: Tak. Process.Start(e.Url.ToString())
SLaks,
2
Lokalny adres URL (plik: ///) nie działa z kwerendą, chyba że exe przeglądarki jest określony jako pierwszy parametr.
HerrimanCoder
2
Należy pamiętać, że ta metoda może również powodować problem z bezpieczeństwem, ponieważ jeśli „adres URL” zostanie zastąpiony fizyczną ścieżką do aplikacji, również się uruchomi
Gerrie Pretorius
1
@Spencer: Upewnij się, że adres URL jest zaufany.
SLaks
45

Dla tych, którzy znajdą to pytanie w rdzeniu dotnet. Tutaj znalazłem rozwiązanie

Kod:

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;
        }
    }
}
Joel Harkes
źródło
Dzięki! działa dla mnie ... ale w makach z openpoleceniem zamiastxdg-open
equiman
@Equiman nie robi tego? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)czy będzie to prawdą w Linuksie?
Joel Harkes
Ja to zrobiłem. Ale xdg-commandzwraca „xdg-open: polecenie nie znaleziono”. Następnie przetestowałem z openpoleceniem i działa.
equiman
@Equiman, więc mówisz, że powinienem przełączyć na inne systemy Linux i OSX, aby działało, czy też MacOS nie działa na OSX?
Joel Harkes
1
Myślę, że nie ... moje rozwiązanie jest miłą alternatywą.
equiman
38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

to powinno rozwiązać twój problem

użytkownik2193090
źródło
7
powinna być „static void GotoSite”
Behrooz
15

Czy próbowałeś, Processjak wspomniano tutaj: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Możesz użyć

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
źródło
1
UseShellExecutedomyślnie ma wartość true.
SLaks
4
@SLaks, dzięki. Z drugiej strony należy wspomnieć, że tak musi być true.
Andreas
1
Dla tych, którzy są zbyt leniwi, aby sprawdzić ... Proces wymaga „korzystania z System.Diagnostics”
Nick Roberts
Wydaje się, że jest to trasa wymagana przez WPF. Jeśli to zrobisz Process.Start(url), nie otworzy się nowe okno przeglądarki.
RubyHaus,
5

Spójrz na sterowanie GeckoFX .

GeckoFX to komponent typu open source, który ułatwia osadzanie Mozilla Gecko (Firefox) w dowolnej aplikacji .NET Windows Forms. Napisany w czystym, w pełni komentowanym języku C #, GeckoFX jest idealnym zamiennikiem domyślnej kontrolki WebBrowser opartej na Internet Explorerze.

DOKTOR
źródło
Mój problem polega na tym, że mam przeglądarkę internetową w aplikacji, więc powiedz, że idziesz do Google i wpisujesz „przepełnienie stosu” i kliknij prawym przyciskiem myszy pierwszy link i kliknij „Otwórz w nowym oknie”, otwiera się w IE zamiast Chrome. Czy to coś, co zakodowałem niepoprawnie, czy jest to ustawienie niepoprawne na moim komputerze
Sean
@SLaks: Dlaczego tak mówisz? Nie wydaje mi się, aby napisanie łańcucha było łatwe i ustawienie go jako GetDefaultBrowserPath ().
LEKARZ
@Sean: Jeśli masz przeglądarkę internetową w swojej aplikacji, domyślnie będzie korzystać z IE. Wydarzenie Nawigacja może pomóc ci to obejść.
LEKARZ
Zmodyfikowałem swoją odpowiedź po uświadomieniu sobie, że OP nie chce zmieniać domyślnej przeglądarki uruchomionej przez osobny proces.
LEKARZ
5

Spróbuj tego, oldschoolowy sposób;)

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

using: openit („www.google.com”);

Moh.Kirkuk
źródło
2
Czy nie można tego wykorzystać, „Shellsock”?
Joseph Lennox,
@JosephLennox to doskonały punkt! prawdopodobnie warto wspomnieć, że System.Diagnostics.Process.Start na adres URL bezpośrednio nie jest (wcale?) bezpieczniejszy! z drugiej strony, jeśli użytkownik uruchamia twoją aplikację na ICH komputerze (prawdopodobnie tak jest), najgorsze, co mogą zrobić, to zepsuć własny system: P
Ben
4
@Ben Zależy, skąd pochodzi dane wejściowe. Jeśli jest to wspólne źródło danych, po wprowadzeniu przez użytkownika złośliwego polecenia wszyscy pozostali użytkownicy, którzy klikną „Idź”, będą na łasce tego użytkownika.
Dan Bechard,
4

Po wielu badaniach uważam, że większość podanych odpowiedzi nie będzie działać z rdzeniem dotnet. 1 System.Diagnostics.Process.Start("http://google.com").; - Nie działa z rdzeniem dotnet

2. Będzie działać, ale zablokuje otwieranie nowego okna w przypadku, gdy domyślną przeglądarką jest chrome

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

Poniżej jest najprostszy i będzie działał we wszystkich scenariuszach.

Process.Start("explorer", url);
Mayank Tripathi
źródło
To rozwiązało dla mnie.
Rufw91
3

Otworzyło się dla mnie ustawienie domyślne:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Xero Phane
źródło
Czy jest używany pakiet, który nadaje EventArgs właściwość LinkText?
Nick Roberts
3

dotnet corezgłasza błąd, jeśli używamy Process.Start(URL). Poniższy kod będzie działał w dotnet core. Możesz dodać dowolną przeglądarkę zamiast Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);
Natarajan Ganapathi
źródło
3
Nie jest odpowiedzią na pytanie Q, nie wiadomo kodowi, jaka jest domyślna przeglądarka
Arjan
0

W UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Kibernetik
źródło
To jest Launcher.LaunchUriAsync . Kliknij link, aby uzyskać pełny przykład. Co ciekawe, zwracana wartość pozwala dzwoniącemu wiedzieć, czy adres URL został otwarty, czy nie. Uwaga, dotyczy to Windows 8 / Server2012 / Phone8 i nowszych wersji. Jeśli oprogramowanie musi być zgodne ze starszymi wersjami, nie może z niego korzystać.
Stéphane Gourichon
0

Otwórz dynamicznie

string addres= "Print/" + Id + ".htm";
           System.Diagnostics.Process.Start(Path.Combine(Environment.CurrentDirectory, addres));
سیدرسول میرعظیمی
źródło
0

zaktualizuj rejestr z bieżącą wersją explorer
@ „Software \ 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
źródło