2011-01-02 17 views
169

Projektuję małą aplikację C# i jest w niej przeglądarka internetowa. Obecnie wszystkie moje ustawienia domyślne na moim komputerze mówią, ż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 na otwarcie tych linków w domyślnej przeglądarce? Czy coś jest nie tak na moim komputerze?Jak otworzyć domyślną przeglądarkę w C#

Mój problem polega na tym, że mam przeglądarkę internetową w aplikacji, więc mówisz, że idziesz do google i wpisujesz "przepełnienie stosu" i klikniesz prawym przyciskiem myszy pierwszy link i klikniesz "Otwórz w nowym oknie" otworzy się w IE zamiast Chrome . Czy to coś mam zakodowany nieprawidłowo lub jest ustawienie nie jest poprawne na moim komputerze

=== EDIT ===

To jest naprawdę denerwujące. Jestem już świadomy, że przeglądarka jest IE, ale wcześniej wszystko działało dobrze. Kiedy kliknąłem na link otwarty w chrome. Używałem ostrych narzędzi do tworzenia aplikacji w tym czasie, ponieważ nie mogłem uzyskać 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 uruchomi całą przeglądarkę po kliknięciu łącza, a nie po prostu otworzy nowy link w domyślnej przeglądarce?

+0

Hehe, przekonanie, że IE otworzy Ci Chrome, będzie dla ciebie trudną bitwą. Cóż, nie trochę. To nie działa, jeśli uruchomisz IE bezpośrednio. Lub też Chrome, jeśli IE jest domyślny. –

+0

Czy używasz Mono? – SLaks

+0

@Saksaks Mono? O czym mówisz? – Sean

Odpowiedz

360

można po prostu napisać

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

EDIT: Regulacja WebBrowser jest osadzona kopia IE.
W związku z tym wszelkie linki wewnątrz niego zostaną otwarte w IE.

Aby zmienić to zachowanie, można obsłużyć zdarzenie Navigating.

+0

Zdecydowanie najkrótszy wariant. + dobry punkt wspominając problem z wbudowanym IE. – Andreas

+0

Nie, zdarzenie nawigacyjne jest wywoływane w niewłaściwym procesie. –

+0

@Hans: Co masz na myśli? – SLaks

5

Spójrz na GeckoFX control.

GeckoFX jest komponentem typu open source który ułatwia osadzanie Mozilla Gecko (Firefox) w dowolnej aplikacji Windows .NET Forms. Wpisany czystym, w pełni skomentował C#, GeckoFX jest idealnym zamiennikiem domyślnego kontrolera WebBrowser opartego na Internet Explorerze .

+0

Moim problemem jest to, że mam przeglądarkę internetową w aplikacji, więc mówisz, ż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 w Chrome. Czy jest to coś, co źle zakodowałem, czy też ustawienie na moim komputerze jest nieprawidłowe? – Sean

+0

@Słak: Dlaczego tak mówisz? Nie uważam, że napisanie napisu w ogóle jest trudne i ustawienie go na GetDefaultBrowserPath(). –

+0

@Sean: Jeśli masz przeglądarkę internetową w swojej aplikacji, to domyślnie będzie używać IE. Zdarzenie Nawigacja może Ci w tym pomóc. –

12

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

Można 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); 
} 
+1

Domyślna wartość "UseShellExecute" to true. – SLaks

+4

@SLaks, dzięki. Z drugiej strony ważne jest, aby wspomnieć, że musi to być "prawda". – Andreas

+0

Dla tych zbyt leniwych, aby sprawdzić ... Proces wymaga "using System.Diagnostics" –

24
public void gotoSite(string url) 
{ 
    System.Diagnostics.Process.Start(url); 
} 

że powinno rozwiązać twój problem

+4

powinien być "statyczny nieważny GotoSite" – Behrooz

0

Spróbuj tego, stary sposób szkoła;)

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

używając: openit ("www.google.com ");

+2

Nie można tego wykorzystać, ala, "Shellsock"? –

+0

@JosephLennox to doskonały punkt! Warto chyba wspomnieć, że System.Diagnostics.Process.Start bezpośrednio na adresie URL nie jest dużo (any?) bezpieczniejszy!z drugiej strony, jeśli użytkownik uruchamia aplikację na ICH komputerze (prawdopodobnie są), najgorsze, co mogą zrobić, to złamać własny system: P – Ben

+3

@Ben Zależy, skąd pochodzi dane wejście. Jeśli jest to udostępnione źródło danych, użytkownik może wprowadzić złośliwe polecenie, a wszyscy inni użytkownicy, którzy klikną "Go", będą na łasce tego użytkownika. – Dan

3

To otworzyło domyślne dla mnie.

System.Diagnostics.Process.Start(e.LinkText.ToString()); 
+0

Czy jest używany pakiet, który daje EventArgs właściwość LinkText? –

0

W UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com")); 
+0

To jest [Launcher.LaunchUriAsync] (https://msdn.microsoft.com/library/windows/apps/windows.system.launcher.launchuriasync.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet -1). Kliknij link, aby zobaczyć pełny przykład. Co ciekawe, wartość zwracana pozwala dzwoniącemu dowiedzieć się, czy URL został otwarty, czy nie. Uwaga, dotyczy to systemu Windows 8/Server2012/Phone8 i nowszych wersji. Jeśli oprogramowanie musi być kompatybilne ze starszymi wersjami, nie może tego użyć. –

9

Dla tych, znalezienie na to pytanie w rdzeniu dotnet znalazłem rozwiązanie here

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

Dzięki! działa dla mnie ... ale w macosach z poleceniem 'open' zamiast' xdg-open' – Equiman

+0

@Equiman nie robi tego? 'RuntimeInformation.IsOSPlatform (OSPlatform.OSX)' lub czy będzie już prawdą w Linuksie? –

+0

Zrobiłem to. Ale 'xdg-command' zwraca" xdg-open: command not found ". Następnie przetestowałem polecenie 'open' i działa. – Equiman

0

Otwórz dynamicznie

string addres= "Print/" + Id + ".htm"; 
      System.Diagnostics.Process.Start(Path.Combine(Environment.CurrentDirectory, addres)); 
Powiązane problemy