จะเปิดหน้าเว็บจากแอปพลิเคชันของฉันได้อย่างไร?


127

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

คำตอบ:


268
System.Diagnostics.Process.Start("http://www.webpage.com");

หนึ่งในหลายวิธี


3
ฉันใช้สิ่งนี้เช่นกัน แต่ตอนนี้ปรากฎว่ามันใช้ไม่ได้กับ UAC ในแอปพลิเคชันของฉันฉันมีสิ่งนี้ในรายการ <requestExecutionLevel level = "requireAdministrator" uiAccess = "false" /> เมื่อฉันเรียกใช้แอปใน Windows 8 (ซึ่งคุณไม่สามารถปิดใช้งาน UAC ได้อีกต่อไป) ฉันได้รับข้อยกเว้นต่อไปนี้เมื่อเปิดหน้าเว็บ : Win32Exception (0x80004005): คลาสไม่ได้ลงทะเบียนที่ System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer

ผลกระทบนี้จะไม่เกิดขึ้นเมื่อฉันเปลี่ยน requireAdministrator เป็น asInvoker แต่แอปไม่ได้รับการยกระดับ :-(
lvmeijer

4
สิ่งนี้อาจเปิดช่องโหว่ด้านความปลอดภัยขนาดใหญ่ในแอปพลิเคชันของคุณหากคุณได้รับ URL โดยบังเอิญจากการป้อนข้อมูลของผู้ใช้และไม่ได้ตรวจสอบว่าเป็น URI จากนั้นพวกเขาสามารถเปิดแอปพลิเคชันที่ต้องการในระบบของคุณ
cdiggins

1
FYI: ทำงานใน Unity, Mono, บน Os X และ Windows มันไม่ทำงานใน iOS ฉันไม่ได้ทดสอบคนอื่น ๆ
มอบให้เมื่อ

2
วิธีการเปิดไฟล์ html ในเครื่อง
guogangj

35

ฉันใช้บรรทัดนี้เพื่อเปิดเบราว์เซอร์เริ่มต้น:

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

1
คำตอบนี้ซ้ำกัน
MAXE

1
@MAXE คำตอบสองคำตอบถูกสร้างขึ้นในนาทีเดียวกัน
4424dev

20

คำตอบที่ยอมรับใช้ไม่ได้บน. NET Core 3อีกต่อไป เพื่อให้ใช้งานได้ใช้วิธีการต่อไปนี้:

var psi = new ProcessStartInfo
{
    FileName = url,
    UseShellExecute = true
};
Process.Start (psi);

19

แม้ว่าจะได้รับคำตอบที่ดี (โดยใช้Process.Start) แต่จะปลอดภัยกว่าที่จะห่อหุ้มไว้ในฟังก์ชันที่ตรวจสอบว่าสตริงที่ส่งผ่านนั้นเป็น URI จริง ๆ เพื่อหลีกเลี่ยงการเริ่มกระบวนการสุ่มบนเครื่องโดยไม่ได้ตั้งใจ

public static bool IsValidUri(string uri)
{
    if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
        return false;
    Uri tmp;
    if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
        return false;
    return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}

public static bool OpenUri(string uri) 
{
    if (!IsValidUri(uri))
        return false;
     System.Diagnostics.Process.Start(uri);
     return true;
}


6

คุณไม่สามารถเปิดหน้าเว็บจากแอปพลิเคชันที่ยกระดับได้ สิ่งนี้จะเพิ่มข้อยกเว้น 0x800004005 อาจเป็นเพราะ explorer.exe และเบราว์เซอร์ไม่ได้รับการยกระดับ

ที่จะเปิดตัวหน้าเว็บจากโปรแกรมประยุกต์สูงในเว็บเบราเซอร์ที่ไม่ใช่การยกระดับให้ใช้ รหัสทำโดยไมค์ฮ ฉันพยายามส่ง URL ไปยัง lpApplicationName แต่ไม่ได้ผล ไม่ใช่เมื่อฉันใช้ CreateProcessWithTokenW กับ lpApplicationName = "explorer.exe" (หรือ iexplore.exe) และ lpCommandLine = url

วิธีแก้ปัญหาต่อไปนี้ใช้งานได้: สร้าง EXE-project ขนาดเล็กที่มีงานเดียว: Process.Start (url) ใช้ CreateProcessWithTokenW เพื่อรัน. EXE ใน Windows 8 RC ของฉันใช้งานได้ดีและเปิดหน้าเว็บใน Google Chrome


1
ดูความคิดเห็นการใช้Explorer.exeเพื่อยกเลิกการยกระดับไม่ได้รับการสนับสนุน: "น่าเสียดายที่ทีมงาน Windows Shell ได้ตอบกลับว่าพฤติกรรมปัจจุบันของ" Explorer.exe AppName.exe "เป็นข้อบกพร่องและอาจใช้ไม่ได้ในการอัปเดต / เวอร์ชันของ Windows ในอนาคตแอปพลิเคชัน ไม่ควรพึ่งมัน”
Carl Walsh

5

นี่คือรหัสทั้งหมดของฉันวิธีการเปิด

มี 2 ​​ตัวเลือก:

  1. เปิดโดยใช้เบราว์เซอร์เริ่มต้น (ลักษณะการทำงานเหมือนเปิดในหน้าต่างเบราว์เซอร์)

  2. เปิดผ่านตัวเลือกคำสั่งเริ่มต้น (ลักษณะการทำงานเหมือนกับคุณใช้คำสั่ง "RUN.EXE")

  3. เปิดผ่าน 'explorer' (ลักษณะการทำงานเหมือนกับที่คุณเขียน url ไว้ใน url หน้าต่างโฟลเดอร์ของคุณ)

[ข้อเสนอแนะเพิ่มเติม] 4. ใช้ตำแหน่งของกระบวนการ iexplore เพื่อเปิด url ที่ต้องการ

รหัส:

internal static bool TryOpenUrl(string p_url)
    {
        // try use default browser [registry: HKEY_CURRENT_USER\Software\Classes\http\shell\open\command]
        try
        {
            string keyValue = Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\Classes\http\shell\open\command", "", null) as string;
            if (string.IsNullOrEmpty(keyValue) == false)
            {
                string browserPath = keyValue.Replace("%1", p_url);
                System.Diagnostics.Process.Start(browserPath);
                return true;
            }
        }
        catch { }

        // try open browser as default command
        try
        {
            System.Diagnostics.Process.Start(p_url); //browserPath, argUrl);
            return true;
        }
        catch { }

        // try open through 'explorer.exe'
        try
        {
            string browserPath = GetWindowsPath("explorer.exe");
            string argUrl = "\"" + p_url + "\"";

            System.Diagnostics.Process.Start(browserPath, argUrl);
            return true;
        }
        catch { }

        // return false, all failed
        return false;
    }

และฟังก์ชันตัวช่วย:

internal static string GetWindowsPath(string p_fileName)
    {
        string path = null;
        string sysdir;

        for (int i = 0; i < 3; i++)
        {
            try
            {
                if (i == 0)
                {
                    path = Environment.GetEnvironmentVariable("SystemRoot");
                }
                else if (i == 1)
                {
                    path = Environment.GetEnvironmentVariable("windir");
                }
                else if (i == 2)
                {
                    sysdir = Environment.GetFolderPath(Environment.SpecialFolder.System);
                    path = System.IO.Directory.GetParent(sysdir).FullName;
                }

                if (path != null)
                {
                    path = System.IO.Path.Combine(path, p_fileName);
                    if (System.IO.File.Exists(path) == true)
                    {
                        return path;
                    }
                }
            }
            catch { }
        }

        // not found
        return null;
    }

หวังว่าฉันจะช่วย


3
สิ่งที่ฉันสงสัยคือ .. ทำไมต้องซับซ้อนขนาดนี้ในเมื่อคนหลาย ๆ คนทำให้มันตายง่ายที่จะตอบคำถามแล้ว?
CularBytes

ทำไมไม่ใช้SearchPathแทนของคุณเองGetWindowsPathล่ะ?
ub3rst4r

3
ทำไมบล็อกจับเปล่า? ไม่ใช่ความคิดที่ดีที่จะกลืนข้อยกเว้น?
reggaeguitar

3

ทางโรงเรียนเก่า;)

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

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


2

ฉันมีวิธีแก้ปัญหานี้เนื่องจากวันนี้ฉันมีปัญหาคล้ายกัน

สมมติว่าคุณต้องการเปิดhttp://google.comจากแอปที่ทำงานด้วยสิทธิ์ผู้ดูแลระบบ:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 

1
ฉันควรใช้การอ้างอิง / เนมสเปซใดสำหรับโซลูชันนี้
SophisticatedUndoing

1
@Sophisticated เลิกทำฉันเชื่อว่า ProcessStartInfo และ Process อยู่ใน System.Diagnostics
Francis Lord
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.