Bagaimana cara membuka halaman web dari aplikasi saya?

126

Saya ingin membuat aplikasi WPF saya membuka browser default dan membuka halaman web tertentu. Bagaimana aku melakukan itu?

Alex Baranosky
sumber

Jawaban:

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

Salah satunya.

Inisheer
sumber
3
Saya menggunakan ini juga, tetapi sekarang ternyata ini tidak berfungsi dengan UAC. Dalam aplikasi saya, saya memiliki ini di manifes <requestExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Ketika saya menjalankan aplikasi di bawah Windows 8 (di mana Anda tidak dapat menonaktifkan UAC lagi), saya mendapatkan pengecualian berikut saat membuka halaman web : Win32Exception (0x80004005): Kelas tidak terdaftar di System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer
Efek ini tidak akan terjadi ketika saya mengubah requireAdministrator menjadi asInvoker. Tapi kemudian aplikasinya tidak dinaikkan :-(
lvmeijer
4
Ini bisa membuka lubang keamanan yang cukup besar di aplikasi Anda jika Anda secara tidak sengaja mendapatkan URL dari input pengguna dan tidak memvalidasi bahwa itu adalah URI. Mereka kemudian dapat meluncurkan aplikasi apa pun yang mereka inginkan di sistem Anda.
cdiggins
1
FYI: Bekerja di Unity, Mono, di Os X dan Windows. Itu tidak berfungsi di iOS. Saya tidak menguji yang lain.
Berikan M
2
Bagaimana dengan membuka file html lokal?
guogangj
34

Saya telah menggunakan baris ini untuk meluncurkan browser default:

System.Diagnostics.Process.Start("http://www.google.com"); 
ajma
sumber
1
Jawaban ini adalah duplikat.
MAXE
1
@MAXE Dua jawaban dibuat dalam menit yang sama.
4424dev
20

Jawaban yang diterima tidak lagi berfungsi di .NET Core 3 . Untuk membuatnya berhasil, gunakan metode berikut:

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

Meskipun jawaban yang bagus telah diberikan (menggunakan Process.Start), akan lebih aman untuk merangkumnya dalam fungsi yang memeriksa bahwa string yang diteruskan memang URI, untuk menghindari memulai proses acak pada mesin secara tidak sengaja.

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;
}
cdiggins.dll
sumber
6

Anda tidak dapat meluncurkan halaman web dari aplikasi yang ditinggikan. Ini akan memunculkan pengecualian 0x800004005, mungkin karena explorer.exe dan browser sedang berjalan non-elevasi.

Untuk meluncurkan halaman web dari aplikasi yang ditinggikan di browser web non-elevasi, gunakan kode yang dibuat oleh Mike Feng . Saya mencoba meneruskan URL ke lpApplicationName tetapi tidak berhasil. Juga tidak ketika saya menggunakan CreateProcessWithTokenW dengan lpApplicationName = "explorer.exe" (atau iexplore.exe) dan lpCommandLine = url.

Solusi berikut ini berhasil: Buat proyek EXE kecil yang memiliki satu tugas: Process.Start (url), gunakan CreateProcessWithTokenW untuk menjalankan .EXE ini. Di Windows 8 RC saya, ini berfungsi dengan baik dan membuka halaman web di Google Chrome.

lvmeijer.dll
sumber
1
Lihat komentar , penggunaan Explorer.exeuntuk menurunkan tidak didukung: "Sayangnya, tim Windows Shell telah menjawab bahwa perilaku saat ini" Explorer.exe AppName.exe "adalah bug dan mungkin tidak berfungsi di pembaruan / versi Windows mendatang. Aplikasi seharusnya tidak mengandalkannya. "
Carl Walsh
4

Ini kode lengkap saya cara membukanya.

ada 2 pilihan:

  1. buka menggunakan browser default (perilaku seperti dibuka di dalam jendela browser)

  2. buka melalui opsi perintah default (perilakunya seperti Anda menggunakan perintah "RUN.EXE")

  3. buka melalui 'explorer' (perilakunya seperti Anda menulis url di dalam url jendela folder Anda)

[saran opsional] 4. gunakan lokasi proses iexplore untuk membuka url yang diperlukan

KODE:

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

dan fungsi Helper:

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

Semoga saya membantu.

mr.baby123
sumber
3
Apa yang saya ingin tahu adalah .. mengapa membuatnya begitu rumit ketika berbagai orang membuatnya mati sederhana untuk menjawab pertanyaan itu?
CularBytes
Mengapa tidak menggunakan SearchPath, bukan milik Anda sendiri GetWindowsPath?
ub3rst4r
3
Mengapa mengosongkan blok tangkapan? Bukankah ide yang buruk untuk hanya menerima pengecualian?
reggaeguitar
3

Cara sekolah lama;)

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

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

Moh.Kirkuk
sumber
2

Saya memiliki solusi untuk ini karena saya memiliki masalah serupa hari ini.

Misalkan Anda ingin membuka http://google.com dari aplikasi yang berjalan dengan hak istimewa admin:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 
winetter
sumber
1
referensi / ruang nama mana yang harus saya gunakan untuk solusi ini?
Canggih, Melakukan
1
@SophanggihUndoing Saya percaya ProcessStartInfo dan Proses terletak di System.Diagnostics
Francis Lord