C # 'da varsayılan tarayıcıda nasıl açılır


259

Küçük bir C # uygulaması tasarlıyorum ve içinde bir web tarayıcısı var. Şu anda bilgisayarımda varsayılanlarımın hepsi google chrome'un varsayılan tarayıcım olduğunu söylüyor, ancak yeni bir pencerede açmak için uygulamamdaki bir bağlantıyı tıkladığımda internet explorer'ı açıyor. Bu bağlantıları varsayılan tarayıcıda açmanın herhangi bir yolu var mı? Yoksa bilgisayarımda bir sorun mu var?

Benim sorunum ben uygulamada bir webbrowser var, bu yüzden google gidin ve "yığın taşması" yazın ve ilk bağlantı sağ tıklayın ve Chrome yerine IE açılır "Yeni pencerede aç" tıklayın. Bu yanlış kodladığım bir şey mi, yoksa bilgisayarımda doğru olmayan bir ayar var mı?

=== DÜZENLEME ===

Bu gerçekten sinir bozucu. Zaten tarayıcı IE olduğunu biliyorum, ama daha önce iyi çalışıyor vardı. Bir bağlantıyı tıkladığımda kromda açıldı. Ben başlatmak için c # express alamadım çünkü o anda uygulama yapmak için keskin geliştirmek kullanıyordum. Yeni bir windows kurulumu yaptım ve uygulamamda çok uzak olmadığımdan, baştan başlamaya karar verdim ve şimdi bu sorunu yaşıyorum. Bu yüzden bilgisayarım olup olmadığından emin değilim. IE, yeni bağlantıyı varsayılan tarayıcıda açmak yerine neden bir bağlantı tıklandığında tüm tarayıcıyı başlatır?


Hehe, IE'yi sizin için Chrome'u açmaya ikna etmek biraz zorlu bir savaş olacak. Biraz değil. IE'yi doğrudan çalıştırırsanız bu da çalışmaz. Veya varsayılan IE ise bu konuda Chrome.
Hans Passant

@SLaks Mono? Neden bahsediyorsun?
Sean

1) getstartMenuDir Firefox veya Chrome StandartName'i Arayın. bulunamadı. 2) 32 64 krom ff kullanmakta olan standart kurulum konumlarının listesini alın. değilse 3) son çare cevapları kullanın.
bh_earth0

Yanıtlar:


506

Sadece yazabilirsin

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

EDIT : DenetimWebBrowser IE gömülü bir kopyasıdır.
Bu nedenle, içindeki tüm bağlantılar IE'de açılır.

Bu davranışı değiştirmek için Navigatingolayı işleyebilirsiniz .


1
Dene. Taskmgr.exe aracını kullandığınızda, iexporer.exe dosyasının iki kopyasının çalıştığını göreceksiniz . Gezinme, işlem dışı olan için tetiklenmez.
Hans Passant

4
@Sean: Evet. Process.Start(e.Url.ToString())
SLaks

2
Tarayıcı URL'si ilk parametre olarak belirtilmedikçe, yerel url (dosya: ///) bir sorgu dizesiyle çalışmaz.
HerrimanCoder

2
"Url" bir uygulamaya fiziksel bir yol ile değiştirilirse, aynı zamanda yürütecektir çünkü bu yöntem de bir güvenlik sorunu getirebilir unutmayın
Gerrie Pretorius

1
@ Spencer: URL'nin güvenilir olduğundan emin olun.
SLaks

45

Dotnet çekirdeğinde bu soruyu bulanlar için. Burada bir çözüm buldum

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

Teşekkürler! benim için çalışıyor ... ama macos openkomut yerine yerinexdg-open
equiman

@ Equiman bunu yapmıyor mu? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)yoksa Linux'ta zaten geçerli olacak mı?
Joel Harkes

Yaptım. Ancak xdg-command"xdg-open: komut bulunamadı" ifadesini döndürür. Sonra openkomutla test ettim ve çalışıyor.
equiman

@Equiman böylece bunu yapmak için elseif linux ve OSX arasında geçiş gerekir diyor ya da macos udner OSX düşmüyor mu?
Joel Harkes

1
Bence değil ... benim çözümüm bir alternatif.
equiman

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

Bu, sorunu çözmeli


7
'statik boşluk GotoSite' olmalıdır
Behrooz

15

Denediniz mi Process: Burada belirtildiği gibi http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Kullanabilirsin

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
UseShellExecutevarsayılanı true değerindedir.
SLaks

4
@SLaks, teşekkürler. Öte yandan olması gerektiğini belirtmek önemlidir true.
Andreas

1
Kontrol etmek için çok tembel olanlar için ... Süreç "System.Diagnostics kullanarak" gerektirir
Nick Roberts

Bu, WPF'nin gerektirdiği rota gibi görünüyor. Sadece yaparsanız Process.Start(url), yeni bir tarayıcı penceresi açmaz.
RubyHaus

5

GeckoFX kontrolüne bir göz atın .

GeckoFX, Mozilla Gecko'nun (Firefox) herhangi bir .NET Windows Forms uygulamasına gömülmesini kolaylaştıran açık kaynaklı bir bileşendir. Temiz, tamamen yorumlanmış C # ile yazılmış GeckoFX, varsayılan Internet Explorer tabanlı WebBrowser denetimi için mükemmel bir alternatiftir.


Benim sorunum ben uygulamada bir webbrowser var, bu yüzden google gidin ve "yığın taşması" yazın ve ilk bağlantı sağ tıklayın ve Chrome yerine IE açılır "Yeni pencerede aç" tıklayın. Bu yanlış kodladığım bir şey mi, yoksa bilgisayarımda doğru olmayan bir ayar var mı
Sean

@SLaks: Bunu neden söylüyorsun? Ben bir dize oluşturmak ve GetDefaultBrowserPath () eşit ayarlamak yazmak hiç zor inanmıyorum.
DOKTOR

@Sean: Uygulamanız içinde bir web tarayıcınız varsa, varsayılan olarak IE kullanacaktır. Gezinme olayı bu sorunu çözmenize yardımcı olabilir.
DOKTOR

OP'nin ayrı bir işlem tarafından başlatılan varsayılan tarayıcıyı değiştirmek istemediğini fark ettikten sonra cevabımı değiştirdim.
DOKTOR

5

Bunu deneyin, eski okul yolu;)

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

kullanma: openit ("www.google.com");


2
Bundan faydalanılamaz mı, ala, "Shellsock"?
Joseph Lennox

@JosephLennox bu mükemmel bir nokta! URL üzerinde System.Diagnostics.Process.Start'ın doğrudan (daha fazla?) daha güvenli olmadığını belirtmek gerekir! Öte yandan, kullanıcı uygulamanızı THEIR bilgisayarında çalıştırıyorsa (muhtemelen), yapabildikleri en kötü şey kendi sistemlerini kırmaktır: P
Ben

4
@Ben Girişin nereden geldiğine bağlıdır. Paylaşılan bir veri kaynağıysa, kullanıcı kötü amaçlı bir komut girerse ve "Git" i tıklayan diğer tüm kullanıcılar bu kullanıcının merhametindedir.
Dan Bechard

5

Çok araştırdıktan sonra verilen cevabın çoğunun dotnet çekirdeği ile çalışmayacağını hissediyorum. 1 System.Diagnostics.Process.Start("http://google.com").; - Dotnet core ile çalışmaz

2. çalışır ama varsayılan tarayıcı krom olması durumunda yeni pencere açılışını engeller

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

Aşağıda en basit ve tüm senaryolarda çalışacaktır.

Process.Start("explorer", url);

Bu benim için çözdü.
Rufw91

3

Bu benim için varsayılanı açtı:

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

Kullandığınız EventArgs'a LinkText özelliğini veren bir paket var mı?
Nick Roberts

3

dotnet corekullanırsak bir hata atar Process.Start(URL). Aşağıdaki kod çalışacaktır dotnet core. Bunun yerine herhangi bir tarayıcı ekleyebilirsiniz Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);

3
Q'nun cevabı değil, kodun varsayılan tarayıcının ne olduğu bilinmemektedir
Arjan

0

UWP'de:

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

Bu Launcher.LaunchUriAsync . Tam örnek için bağlantıyı takip edin. İlginç bir şekilde, dönüş değeri, arayan kişinin URL'nin açılıp açılmadığını bilmesini sağlar. Dikkat, bu Windows 8 / Server2012 / Phone8 ve üstü içindir. Yazılımın eski sürümlerle uyumlu olması gerekiyorsa, bunu kullanamaz.
Stéphane Gourichon


0

kayıt defterini explorer
@ "Software \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION" sürümüyle güncelleyin

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.