วิธีเปิดในเบราว์เซอร์เริ่มต้นใน C #


257

ฉันกำลังออกแบบแอปพลิเคชัน C # ขนาดเล็กและมีเว็บเบราว์เซอร์ในนั้น ขณะนี้ฉันมีค่าเริ่มต้นทั้งหมดในคอมพิวเตอร์ของฉันว่า google chrome เป็นเบราว์เซอร์เริ่มต้นของฉัน แต่เมื่อฉันคลิกลิงก์ในแอปพลิเคชันของฉันเพื่อเปิดในหน้าต่างใหม่มันเปิด Internet explorer มีวิธีใดที่จะทำให้ลิงก์เหล่านี้เปิดในเบราว์เซอร์เริ่มต้นแทนหรือไม่ หรือมีสิ่งผิดปกติในคอมพิวเตอร์ของฉัน

ปัญหาของฉันคือฉันมีเว็บเบราว์เซอร์ในแอปพลิเคชันดังนั้นถ้าคุณไปที่ google แล้วพิมพ์ "stack overflow" และคลิกขวาที่ลิงค์แรกและคลิก "เปิดในหน้าต่างใหม่" มันเปิดใน IE แทน Chrome นี่เป็นสิ่งที่ฉันทำรหัสไม่ถูกต้องหรือมีการตั้งค่าที่ไม่ถูกต้องในคอมพิวเตอร์ของฉัน

=== === แก้ไข

มันน่ารำคาญจริงๆ ฉันรู้แล้วว่าเบราว์เซอร์นั้นเป็น IE แต่ฉันก็ใช้งานได้ดีมาก่อน เมื่อฉันคลิกลิงค์จะเปิดขึ้นในโครเมี่ยม ฉันใช้การพัฒนาที่คมชัดเพื่อสร้างแอปพลิเคชันในเวลานั้นเพราะฉันไม่สามารถเริ่ม c # express ฉันติดตั้ง windows ใหม่และเนื่องจากฉันไม่ได้อยู่ในแอปพลิเคชันของฉันฉันจึงตัดสินใจเริ่มต้นใหม่และตอนนี้ฉันมีปัญหานี้ นั่นคือสาเหตุที่ฉันไม่แน่ใจว่าเป็นคอมพิวเตอร์ของฉันหรือไม่ เหตุใด IE จะเริ่มต้นเบราว์เซอร์ทั้งหมดเมื่อมีการคลิกลิงก์แทนที่จะเป็นการเปิดลิงก์ใหม่ในเบราว์เซอร์เริ่มต้น


เฮ้เชื่อว่าการเปิด Chrome สำหรับคุณนั้นน่าจะเป็นการต่อสู้ที่ยากลำบาก ก็ไม่น้อย มันไม่ทำงานถ้าคุณใช้ IE โดยตรง หรือ Chrome สำหรับเรื่องนั้นถ้า IE เป็นค่าเริ่มต้น
Hans Passant

@SLaks Mono? คุณกำลังพูดเรื่องอะไร
Sean

1) getstartMenuDir ค้นหา Firefox หรือ Chrome StandartName Besure หากไม่พบ 2) รับรายชื่อสถานที่ติดตั้งมาตรฐานที่เคยมีอยู่ 32 64 chrome ff ใช้มัน ถ้าไม่ใช่ 3) สุดท้ายใช้คำตอบ
bh_earth0

คำตอบ:


505

คุณสามารถเขียนได้

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

แก้ไข : การWebBrowserควบคุมเป็นสำเนาที่ฝังตัวของ IE
ดังนั้นลิงก์ใด ๆ ที่อยู่ภายในจะเปิดขึ้นใน IE

หากต้องการเปลี่ยนพฤติกรรมนี้คุณสามารถจัดการกับNavigatingเหตุการณ์


1
ลองมัน. ใช้ Taskmgr.exe คุณจะเห็นiexporer.exe สองชุดที่ทำงานอยู่ การนำทางไม่ได้เกิดขึ้นกับกระบวนการที่อยู่นอกกระบวนการ
ฮันส์แพสแทนท์

4
@Sean: ใช่ Process.Start(e.Url.ToString())
slaks

2
Local url (ไฟล์: ///) ใช้งานไม่ได้กับการสอบถามเว้นแต่เบราว์เซอร์ exe ถูกระบุเป็นพารามิเตอร์แรก
HerrimanCoder

2
โปรดทราบว่าวิธีการนี้สามารถแนะนำปัญหาด้านความปลอดภัยได้เนื่องจากหาก "url" ถูกแทนที่ด้วยพา ธ ทางกายภาพไปยังแอปพลิเคชันระบบจะดำเนินการด้วย
Gerrie Pretorius

1
@Spencer: ตรวจสอบให้แน่ใจว่า URL นั้นเชื่อถือได้
slaks

45

สำหรับผู้ที่พบคำถามนี้ใน dotnet core ฉันพบวิธีแก้ปัญหาที่นี่

รหัส:

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

ขอบคุณ! ใช้งานได้สำหรับฉัน ... แต่ใน macos พร้อมopenคำสั่งแทนxdg-open
equiman

@Equiman มันทำไม่ได้เหรอ? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)หรือจะเป็นจริงที่ Linux หรือไม่
Joel Harkes

ฉันทำมัน แต่xdg-commandกลับ "xdg-open: ไม่พบคำสั่ง" จากนั้นฉันทดสอบด้วยopenคำสั่งและทำงาน
equiman

@Equiman ดังนั้นคุณกำลังพูดว่าฉันควรสลับ elseif linux และ OSX ไปรอบ ๆ เพื่อให้มันทำงานหรือไม่ macos ไม่ตก udner OSX?
Joel Harkes

1
ฉันคิดว่าไม่ ... ทางออกของฉันเป็นทางเลือก
equiman

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

ที่ควรแก้ปัญหาของคุณ


7
ควรจะ 'เป็นโมฆะคง GotoSite'
Behrooz

15

คุณลองProcessตามที่กล่าวไว้ที่นี่: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspxหรือไม่

คุณสามารถใช้

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
UseShellExecuteค่าเริ่มต้นเป็นจริง
slaks

4
@SLaks ขอบคุณ trueในทางตรงกันข้ามมันเป็นสิ่งสำคัญที่จะพูดถึงว่ามันจะต้องมี
Andreas

1
สำหรับผู้ที่ขี้เกียจเกินกว่าที่จะตรวจสอบ ... กระบวนการต้อง "ใช้ System.Diagnostics"
Nick Roberts

นี่น่าจะเป็นเส้นทางที่ WPF ต้องการ หากคุณทำเช่นProcess.Start(url)นั้นจะไม่เปิดหน้าต่างเบราว์เซอร์ใหม่
RubyHaus

5

ลองดูที่การควบคุม GeckoFX

GeckoFX เป็นส่วนประกอบโอเพนซอร์ซซึ่งทำให้ง่ายต่อการฝัง Mozilla Gecko (Firefox) ในแอพพลิเคชั่น. NET Windows Forms เขียนใน C # ที่สะอาดและแสดงความคิดเห็นได้อย่างเต็มที่ GeckoFX คือการแทนที่ที่สมบูรณ์แบบสำหรับการควบคุมเว็บเบราว์เซอร์ที่ใช้ Internet Explorer เป็นค่าเริ่มต้น


ปัญหาของฉันคือฉันมีเว็บเบราว์เซอร์ในแอปพลิเคชันดังนั้นถ้าคุณไปที่ google แล้วพิมพ์ "stack overflow" และคลิกขวาที่ลิงค์แรกและคลิก "เปิดในหน้าต่างใหม่" มันเปิดใน IE แทน Chrome นี่เป็นสิ่งที่ฉันได้เขียนรหัสไม่ถูกต้องหรือมีการตั้งค่าที่ไม่ถูกต้องในคอมพิวเตอร์ของฉัน
Sean

@SLaks: ทำไมคุณพูดอย่างนั้น? ฉันไม่เชื่อว่ามันเป็นเรื่องยากที่จะเขียนสร้างสตริงและตั้งค่าเท่ากับ GetDefaultBrowserPath ()
หมอ

@Sean: หากคุณมีเว็บเบราเซอร์ในแอปพลิเคชันของคุณก็จะใช้ IE เป็นค่าเริ่มต้น เหตุการณ์การนำทางสามารถช่วยให้คุณเข้าใจได้
หมอ

ฉันได้แก้ไขคำตอบหลังจากทราบว่า OP ไม่ต้องการเปลี่ยนเบราว์เซอร์เริ่มต้นที่เปิดใช้งานโดยกระบวนการแยกต่างหาก
หมอ

5

ลองสิ่งนี้ทางโรงเรียนเก่า;)

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

ใช้: openit ("www.google.com");


2
สิ่งนี้ไม่สามารถถูกเอาเปรียบใช่ไหม "Shellsock" ใช่ไหม
Joseph Lennox

@JosephLennox นั่นเป็นจุดที่ยอดเยี่ยม! อาจเป็นมูลค่าการกล่าวขวัญว่า System.Diagnostics.Process.Start บน URL โดยตรงไม่มาก (มี?) ปลอดภัยกว่า! ในทางกลับกันหากผู้ใช้เรียกใช้แอปพลิเคชันของคุณบนคอมพิวเตอร์ของพวกเขา (ที่อาจเป็น) สิ่งที่แย่ที่สุดที่พวกเขาทำได้คือทำลายระบบของตัวเอง: P
Ben

4
@Ben ขึ้นอยู่กับว่าอินพุตมาจากไหน หากเป็นแหล่งข้อมูลที่ใช้ร่วมกันเมื่อผู้ใช้สามารถป้อนคำสั่งที่เป็นอันตรายและผู้ใช้อื่นทั้งหมดที่คลิก "ไป" จะเป็นความเมตตาของผู้ใช้
Dan Bechard

4

หลังจากค้นคว้ามากฉันรู้สึกว่าคำตอบที่ได้รับส่วนใหญ่จะไม่ทำงานกับ dotnet core 1. System.Diagnostics.Process.Start("http://google.com"); - จะไม่ทำงานกับ dotnet core

2. มันจะทำงาน แต่มันจะปิดกั้นการเปิดหน้าต่างใหม่ในกรณีที่เบราว์เซอร์เริ่มต้นเป็นโครเมี่ยม

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

ด้านล่างนี้เป็นวิธีที่ง่ายที่สุดและจะใช้ได้ในทุกสถานการณ์

Process.Start("explorer", url);

วิธีนี้แก้ไขได้สำหรับฉัน
Rufw91

3

สิ่งนี้เปิดเป็นค่าเริ่มต้นสำหรับฉัน:

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

มีแพ็คเกจที่คุณใช้ซึ่งให้คุณสมบัติของ EventArgs ของ LinkText หรือไม่
Nick Roberts

3

dotnet coreProcess.Start(URL)โยนข้อผิดพลาดถ้าเราใช้ dotnet coreรหัสต่อไปนี้จะทำงานใน คุณสามารถเพิ่มเบราว์เซอร์ใด ๆ Chromeแทน

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

3
ไม่ใช่คำตอบสำหรับ Q มันไม่รู้รหัสว่าเบราว์เซอร์เริ่มต้นคืออะไร
Arjan

0

ใน UWP:

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

นี่คือLauncher.LaunchUriAsync ตามลิงค์สำหรับตัวอย่างที่สมบูรณ์ ที่น่าสนใจคือค่าที่ส่งคืนทำให้ผู้เรียกทราบว่าเปิด URL หรือไม่ ระวังนี่สำหรับ Windows 8 / Server2012 / Phone8 ขึ้นไป หากซอฟต์แวร์นั้นต้องเข้ากันได้กับเวอร์ชั่นที่เก่ากว่าจะไม่สามารถใช้สิ่งนั้นได้
Stéphane Gourichon


0

อัปเดตรีจิสทรีด้วย 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.