Cara membuka di browser default di C #

258

Saya merancang aplikasi C # kecil dan ada browser web di dalamnya. Saat ini saya memiliki semua default saya di komputer saya mengatakan google chrome adalah browser default saya, namun ketika saya mengklik tautan di aplikasi saya untuk membuka di jendela baru, itu membuka internet explorer. Apakah ada cara untuk membuat tautan ini terbuka di browser default? Atau ada yang tidak beres di komputer saya?

Masalah saya adalah bahwa saya memiliki browser web di aplikasi, jadi katakan Anda pergi ke google dan ketik "stack overflow" dan klik kanan tautan pertama dan klik "Buka di jendela baru" itu terbuka di IE bukan Chrome. Apakah ini sesuatu yang saya kode salah, atau ada pengaturan yang tidak benar di komputer saya

=== EDIT ===

Ini sangat menjengkelkan. Saya sudah mengetahui bahwa browser itu adalah IE, tetapi saya sudah berfungsi dengan baik sebelumnya. Ketika saya mengklik sebuah tautan, tautan itu terbuka di chrome. Saya menggunakan pengembangan yang tajam untuk membuat aplikasi pada saat itu karena saya tidak bisa mendapatkan c # express untuk memulai. Saya melakukan instalasi windows baru dan karena saya tidak terlalu jauh dalam aplikasi saya, saya memutuskan untuk memulai lagi, dan sekarang saya mengalami masalah ini. Itu sebabnya saya tidak yakin apakah itu komputer saya atau tidak. Mengapa IE memulai seluruh browser saat tautan diklik daripada hanya membuka tautan baru di browser default?

Sean
sumber
Hehe, meyakinkan IE untuk membuka Chrome untuk Anda akan menjadi sedikit perjuangan berat. Yah, tidak sedikit. Ini tidak berfungsi baik jika Anda menjalankan IE secara langsung. Atau Chrome untuk masalah ini jika IE adalah default.
Hans Passant
@ SLaks Mono? Apa yang kamu bicarakan?
Sean
1) getstartMenuDir Mencari Firefox atau Chrome StandartName Besure. jika tidak ditemukan. 2) dapatkan daftar lokasi pemasangan standar yang pernah ada 32 64 chrome ff gunakan itu. jika tidak 3) pilihan terakhir gunakan jawabannya.
bh_earth0

Jawaban:

506

Anda bisa menulis

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

EDIT : WebBrowserKontrol adalah salinan IE yang tertanam.
Karena itu, semua tautan di dalamnya akan terbuka di IE.

Untuk mengubah perilaku ini, Anda dapat menangani Navigatingacara tersebut.

Slaks
sumber
1
Cobalah. Gunakan Taskmgr.exe, Anda akan melihat dua salinan iexporer.exe berjalan. Menavigasi tidak dapat digunakan untuk proses yang tidak berjalan.
Hans Passant
4
@Sean: Ya. Process.Start(e.Url.ToString())
SLaks
2
URL lokal (file: ///) tidak berfungsi dengan querystring kecuali browser exe ditentukan sebagai param pertama.
HerrimanCoder
2
Sadarilah bahwa metode kaleng ini juga dapat memperkenalkan masalah keamanan, karena, jika "url" diganti dengan jalur fisik ke aplikasi yang juga akan dijalankan
Gerrie Pretorius
1
@Spencer: Pastikan URL dipercaya.
Slaks
45

Bagi mereka yang menemukan pertanyaan ini di dotnet core. Saya menemukan solusinya di sini

Kode:

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
sumber
Terima kasih! bekerja untuk saya ... tetapi dalam makro dengan openperintah bukannyaxdg-open
equiman
@Equiman tidakkah itu melakukan itu? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)atau apakah itu sudah benar di Linux?
Joel Harkes
Saya melakukannya. Tetapi xdg-commandmengembalikan "xdg-open: command not found". Kemudian saya diuji dengan openperintah dan bekerja.
equiman
@ Equiman jadi Anda mengatakan saya harus beralih elseif linux dan OSX sekitar untuk membuatnya bekerja atau apakah Macos tidak jatuh OSX udner?
Joel Harkes
1
Saya kira tidak ... solusi saya adalah alternatif.
equiman
38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

yang seharusnya bisa menyelesaikan masalah Anda

pengguna2193090
sumber
7
harus menjadi 'static void GotoSite'
Behrooz
15

Apakah Anda mencoba Processseperti yang disebutkan di sini: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Anda bisa menggunakannya

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
sumber
1
UseShellExecutedefault ke true.
SLaks
4
@ SLaks, terima kasih. Di sisi lain, penting untuk menyebutkan bahwa itu harus true.
Andreas
1
Bagi mereka yang terlalu malas untuk memeriksa ... Proses membutuhkan "menggunakan System.Diagnostics"
Nick Roberts
Ini sepertinya rute yang diperlukan oleh WPF. Jika Anda melakukannya Process.Start(url), itu tidak membuka jendela browser baru.
RubyHaus
5

Lihatlah kontrol GeckoFX .

GeckoFX adalah komponen open-source yang membuatnya mudah untuk menanamkan Mozilla Gecko (Firefox) ke dalam setiap aplikasi .NET Windows Forms. Ditulis dalam C # yang bersih dan sepenuhnya berkomentar, GeckoFX adalah pengganti yang sempurna untuk kontrol WebBrowser berbasis Internet Explorer default.

DOKTER
sumber
Masalah saya adalah bahwa saya memiliki browser web di aplikasi, jadi katakan Anda pergi ke google dan ketik "stack overflow" dan klik kanan tautan pertama dan klik "Buka di jendela baru" itu terbuka di IE bukan Chrome. Apakah ini sesuatu yang saya kode salah, atau ada pengaturan yang tidak benar di komputer saya
Sean
@SLaks: Mengapa Anda mengatakan itu? Saya tidak percaya sama sekali sulit untuk menulis membuat string dan set sama dengan GetDefaultBrowserPath ().
THE DOCTOR
@Sean: Jika Anda memiliki browser web di dalam aplikasi Anda maka ia akan menggunakan IE secara default. Acara Navigasi dapat membantu Anda menyiasatinya.
THE DOCTOR
Saya telah mengubah jawaban saya setelah menyadari bahwa OP tidak ingin mengubah browser default yang diluncurkan oleh proses terpisah.
THE DOCTOR
5

Coba ini, cara jadul;)

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

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

Moh.Kirkuk
sumber
2
Tidak bisakah ini dieksploitasi, ala, "Shellsock"?
Joseph Lennox
@ JosephLennox itu poin yang sangat baik! mungkin perlu disebutkan bahwa System.Diagnostics.Process.Start pada URL secara langsung tidak banyak (ada?) lebih aman! di sisi lain, jika pengguna menjalankan aplikasi Anda pada komputer MEREKA (mungkin mereka), yang terburuk yang dapat mereka lakukan adalah menghancurkan sistem mereka sendiri: P
Ben
4
@ Ben Tergantung dari mana input berasal. Jika itu adalah sumber data bersama, setelah pengguna dapat memasukkan perintah jahat dan semua pengguna lain yang mengklik "Pergi" akan berada di tangan pengguna itu.
Dan Bechard
4

Setelah banyak meneliti saya merasa sebagian besar jawaban yang diberikan tidak akan bekerja dengan inti dotnet. 1 System.Diagnostics.Process.Start("http://google.com").; - Tidak akan bekerja dengan inti dotnet

2. Ini akan berfungsi tetapi itu akan memblokir pembukaan jendela baru jika browser default adalah chrome

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

Di bawah ini adalah yang paling sederhana dan akan bekerja di semua skenario.

Process.Start("explorer", url);
Mayank Tripathi
sumber
Ini menyelesaikannya untuk saya.
Rufw91
3

Ini membuka default untuk saya:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Xero Phane
sumber
Apakah ada paket yang Anda gunakan yang memberi EventArgs properti dari LinkText?
Nick Roberts
3

dotnet coremelempar kesalahan jika kita gunakan Process.Start(URL). Kode berikut akan berfungsi di dotnet core. Anda dapat menambahkan browser apa saja sebagai gantinya Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);
Natarajan Ganapathi
sumber
3
Bukan jawaban untuk Q, tidak diketahui kode apa peramban default
Arjan
0

Di UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Kibernetik
sumber
Ini adalah Launcher.LaunchUriAsync . Ikuti tautan untuk contoh lengkap. Menariknya, nilai kembali memungkinkan penelepon mengetahui apakah URL dibuka atau tidak. Hati-hati, ini untuk Windows 8 / Server2012 / Phone8 dan yang lebih tinggi. Jika perangkat lunak harus kompatibel dengan versi yang lebih lama, itu tidak dapat menggunakannya.
Stéphane Gourichon
0

Buka secara dinamis

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

perbarui registri dengan versi explorer
@ "Software \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION" saat ini

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
sumber