Cách mở trong trình duyệt mặc định trong C #


257

Tôi đang thiết kế một ứng dụng C # nhỏ và có một trình duyệt web trong đó. Hiện tại tôi có tất cả các mặc định trên máy tính của mình, nói rằng google chrome là trình duyệt mặc định của tôi, nhưng khi tôi nhấp vào một liên kết trong ứng dụng của mình để mở trong một cửa sổ mới, nó sẽ mở trình duyệt internet. Có cách nào để làm cho các liên kết này mở trong trình duyệt mặc định không? Hoặc có cái gì đó sai trên máy tính của tôi?

Vấn đề của tôi là tôi có một webbrowser trong ứng dụng, vì vậy hãy nói rằng bạn vào google và gõ "stack overflow" và nhấp chuột phải vào liên kết đầu tiên và nhấp vào "Mở trong cửa sổ mới", nó sẽ mở trong IE thay vì Chrome. Đây có phải là thứ tôi đã mã hóa không đúng hoặc có cài đặt không chính xác trên máy tính của tôi không

=== CHỈNH SỬA ===

Điều này thực sự gây phiền nhiễu. Tôi đã biết rằng trình duyệt là IE, nhưng tôi đã có nó hoạt động tốt trước đây. Khi tôi nhấp vào một liên kết, nó được mở bằng chrome. Tôi đã sử dụng phát triển sắc nét để tạo ra ứng dụng tại thời điểm đó vì tôi không thể khởi động c # express. Tôi đã cài đặt windows mới và vì tôi không ở quá xa trong ứng dụng của mình, tôi quyết định bắt đầu lại và bây giờ tôi đang gặp vấn đề này. Đó là lý do tại sao tôi không chắc nó có phải là máy tính của tôi hay không. Tại sao IE sẽ khởi động toàn bộ trình duyệt khi nhấp vào liên kết thay vì chỉ mở liên kết mới trong trình duyệt mặc định?


Hehe, thuyết phục IE mở Chrome cho bạn sẽ là một trận chiến khó khăn. Vâng, không một chút. Điều này cũng không hoạt động nếu bạn chạy IE trực tiếp. Hoặc Chrome cho vấn đề đó nếu IE là mặc định.
Hans Passant

@SLaks Mono? Bạn đang nói về cái gì vậy?
Sean

1) getstartMothyDir Tìm kiếm cho Firefox hoặc Chrome StandartName Besure. nếu không tìm thấy 2) nhận danh sách các vị trí cài đặt tiêu chuẩn tồn tại 32 64 chrome ff sử dụng. nếu không 3) phương sách cuối cùng sử dụng các câu trả lời.
bh_earth0

Câu trả lời:


505

Bạn chỉ có thể viết

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

EDIT : Điều WebBrowserkhiển là một bản sao nhúng của IE.
Do đó, bất kỳ liên kết bên trong của nó sẽ mở trong IE.

Để thay đổi hành vi này, bạn có thể xử lý Navigatingsự kiện.


1
Thử nó. Sử dụng TASkmgr.exe, bạn sẽ thấy hai bản sao của iexporer.exe đang chạy. Điều hướng không bắn cho người ngoài quy trình.
Hans Passant

4
@Sean: Vâng. Process.Start(e.Url.ToString())
SLaks

2
Url cục bộ (tệp: ///) không hoạt động với chuỗi truy vấn trừ khi exe trình duyệt được chỉ định làm thông số đầu tiên.
HerrimanCoder

2
Xin lưu ý rằng phương thức này cũng có thể gây ra vấn đề bảo mật, vì, nếu "url" được thay thế bằng đường dẫn vật lý đến một ứng dụng, nó cũng sẽ thực thi
Gerrie Pretorius

1
@Spencer: Đảm bảo URL được tin cậy.
SLaks

45

Đối với những người tìm thấy câu hỏi này trong lõi dotnet. Tôi tìm thấy một giải pháp ở đây

Mã số:

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

Cảm ơn! hoạt động với tôi ... nhưng trong macos với openlệnh thay vìxdg-open
Equiman

@Equiman không làm điều đó? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)hoặc nó đã đúng ở Linux?
Joel Harkes

Tôi đã làm nó. Nhưng xdg-commandtrả về "xdg-open: lệnh không tìm thấy". Sau đó, tôi đã thử nghiệm với openlệnh và hoạt động.
Equiman

@Equiman vì vậy bạn đang nói rằng tôi nên chuyển đổi linux và OSX xung quanh để làm cho nó hoạt động hoặc macos không rơi OSX?
Joel Harkes

1
Tôi nghĩ rằng không ... giải pháp của tôi là một sự thay thế.
Equiman

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

điều đó sẽ giải quyết vấn đề của bạn


7
nên là 'void void GotoSite'
Behrooz

15

Bạn đã thử Processnhư đã đề cập ở đây: http://msdn.microsoft.com/de-de/l Library / system.diagnostics . Process.aspx ?

Bạn đã có thể sử dụng

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
UseShellExecutemặc định là đúng
SLaks

4
@SLaks, cảm ơn. Mặt khác, điều quan trọng là phải đề cập rằng nó phải được true.
Andreas

1
Đối với những người quá lười kiểm tra ... Quá trình yêu cầu "sử dụng System.Diagnostics"
Nick Roberts

Đây dường như là tuyến đường được yêu cầu bởi WPF. Nếu bạn chỉ làm Process.Start(url), nó không mở một cửa sổ trình duyệt mới.
RubyHaus

5

Hãy xem điều khiển GeckoFX .

GeckoFX là một thành phần nguồn mở giúp dễ dàng nhúng Mozilla Gecko (Firefox) vào bất kỳ ứng dụng .NET Windows Forms nào. Được viết bằng C # rõ ràng, được nhận xét đầy đủ, GeckoFX là sự thay thế hoàn hảo cho điều khiển WebBrowser dựa trên Internet Explorer mặc định.


Vấn đề của tôi là tôi có một webbrowser trong ứng dụng, vì vậy hãy nói rằng bạn vào google và gõ "stack overflow" và nhấp chuột phải vào liên kết đầu tiên và nhấp vào "Mở trong cửa sổ mới", nó sẽ mở trong IE thay vì Chrome. Đây có phải là thứ tôi đã mã hóa không đúng, hoặc có một cài đặt không chính xác trên máy tính của tôi
Sean

@SLaks: Tại sao bạn nói vậy? Tôi không tin rằng thật khó để viết một chuỗi và đặt nó bằng với GetDefaultBrowserPath ().
BÁC S

@Sean: Nếu bạn có một webbrowser trong ứng dụng của mình thì nó sẽ sử dụng IE theo mặc định. Sự kiện điều hướng có thể giúp bạn khắc phục điều đó.
BÁC S

Tôi đã sửa đổi câu trả lời của mình sau khi nhận ra rằng OP không muốn thay đổi trình duyệt mặc định được khởi chạy bởi một quy trình riêng biệt.
BÁC S

5

Hãy thử điều này, cách học cũ;)

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

sử dụng: openit ("www.google.com");


2
Điều này không thể được khai thác, ala, "Shellsock"?
Joseph Lennox

@JosephLennox đó là một điểm tuyệt vời! có lẽ đáng để đề cập rằng System.Diagnostics.Process. Bắt đầu với URL trực tiếp không an toàn hơn (bất kỳ?)! mặt khác, nếu người dùng đang chạy ứng dụng của bạn trên máy tính THEIR (có lẽ họ là vậy), điều tồi tệ nhất họ có thể làm là phá vỡ hệ thống của chính họ: P
Ben

4
@Ben Phụ thuộc vào nơi đầu vào đến. Nếu đó là nguồn dữ liệu được chia sẻ, một khi người dùng có thể nhập lệnh độc hại và tất cả người dùng khác nhấp vào "Đi" sẽ phải chịu sự thương xót của người dùng đó.
Dan Bechard 17/03/2016

4

Sau khi nghiên cứu rất nhiều, tôi cảm thấy hầu hết các câu trả lời đã cho sẽ không hoạt động với lõi dotnet. 1 System.Diagnostics.Process.Start("http://google.com").; - Sẽ không hoạt động với lõi dotnet

2. Nó sẽ hoạt động nhưng nó sẽ chặn cửa sổ mới mở trong trường hợp trình duyệt mặc định là chrome

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

Dưới đây là đơn giản nhất và sẽ làm việc trong tất cả các kịch bản.

Process.Start("explorer", url);

Điều này đã giải quyết nó cho tôi.
Rufw91

3

Điều này đã mở mặc định cho tôi:

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

Có gói nào bạn đang sử dụng cung cấp cho EventArss thuộc tính của LinkText không?
Nick Roberts

3

dotnet coreném một lỗi nếu chúng ta sử dụng Process.Start(URL). Các mã sau đây sẽ làm việc trong dotnet core. Bạn có thể thêm bất kỳ trình duyệt nào thay vì Chrome.

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

3
Không phải là câu trả lời cho Q, người ta không biết mã trình duyệt mặc định là gì
Arjan

0

Trong UWP:

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

Đây là Launcher.LaunchUriAsync . Theo liên kết cho ví dụ đầy đủ. Điều thú vị là giá trị trả về cho phép người gọi biết liệu URL có được mở hay không. Coi chừng, cái này dành cho Windows 8 / Server2012 / Phone8 trở lên. Nếu phần mềm phải tương thích với các phiên bản cũ hơn, nó không thể sử dụng phần mềm đó.
Stéphane Gourichon

0

Mở động

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

0

cập nhật sổ đăng ký với phiên bản hiện tại của trình thám hiểm
@ "Phần mềm \ 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.