Làm thế nào để mở một trang web từ ứng dụng của tôi?


126

Tôi muốn làm cho ứng dụng WPF của mình mở trình duyệt mặc định và đi đến một trang web nhất định. Làm thế nào để làm điều đó?

Câu trả lời:


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

Một trong nhiều cách.


3
Tôi cũng đã sử dụng nó, nhưng bây giờ hóa ra nó không hoạt động với UAC. Trong ứng dụng của tôi, tôi có cái này trong tệp kê khai <RequestExecutLevel level = "allowAd Administrator" uiAccess = "false" /> Khi tôi chạy ứng dụng trong Windows 8 (nơi bạn không thể tắt UAC nữa), tôi gặp ngoại lệ sau khi mở trang web : Win32Exception (0x80004005): Lớp chưa được đăng ký tại System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer

Hiệu ứng này sẽ không xảy ra khi tôi thay đổi yêu cầu Quản trị viên thành asInvoker. Nhưng sau đó, ứng dụng không được nâng lên :-(
lvmeijer

4
Điều này có thể mở ra một lỗ hổng bảo mật khá lớn trong ứng dụng của bạn nếu bạn vô tình lấy URL từ đầu vào của người dùng và không xác thực rằng đó là một URI. Sau đó, họ có thể khởi chạy bất kỳ ứng dụng nào họ muốn trên hệ thống của bạn.
cdiggins 6/11/2015

1
FYI: Hoạt động trong Unity, Mono, trên Os X và Windows. Nó không hoạt động trong iOS. Tôi đã không kiểm tra những người khác.
Cấp M

2
Làm thế nào về việc mở một tệp html cục bộ?
guogangj

34

Tôi đã sử dụng dòng này để khởi chạy trình duyệt mặc định:

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

1
Câu trả lời này là một bản sao.
MAXE

1
@MAXE Hai câu trả lời đã được tạo trong cùng một phút.
4424dev

20

Câu trả lời được chấp nhận không còn hoạt động trên .NET Core 3 . Để làm cho nó hoạt động, sử dụng phương pháp sau:

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

19

Mặc dù đã có một câu trả lời tốt (sử dụng Process.Start), nhưng sẽ an toàn hơn khi gói nó trong một hàm kiểm tra xem chuỗi đã truyền có thực sự là URI hay không, để tránh việc vô tình bắt đầu các quá trình ngẫu nhiên trên máy.

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

Bạn không thể khởi chạy một trang web từ một ứng dụng nâng cao. Điều này sẽ đưa ra một ngoại lệ 0x800004005, có thể là do explorer.exe và trình duyệt đang chạy không nâng cao.

Để khởi chạy một trang web từ một ứng dụng nâng cao trong trình duyệt web không nâng cao, hãy sử dụng mã được tạo bởi Mike Feng . Tôi đã cố gắng chuyển URL sang lpApplicationName nhưng không được. Cũng không phải khi tôi sử dụng CreatProcessWithTokenW với lpApplicationName = "explorer.exe" (hoặc iexplore.exe) và lpCommandLine = url.

Cách giải quyết sau đây không hoạt động: Tạo một dự án EXE nhỏ có một tác vụ: Process.Start (url), sử dụng CreatProcessWithTokenW để chạy .EXE này. Trên Windows 8 RC của tôi, nó hoạt động tốt và mở trang web trong Google Chrome.


1
Xem bình luận , sử dụng Explorer.exeđể giảm độ cao không được hỗ trợ: "Thật không may, nhóm Windows Shell đã trả lời rằng hành vi hiện tại của" Explorer.exe AppName.exe "là một lỗi và có thể không hoạt động trong các bản cập nhật / phiên bản Windows trong tương lai. không nên dựa vào nó. "
Carl Walsh

4

Đây là mã hoàn chỉnh của tôi làm thế nào để mở.

có 2 lựa chọn:

  1. mở bằng trình duyệt mặc định (hành vi giống như mở bên trong cửa sổ trình duyệt)

  2. mở thông qua các tùy chọn lệnh mặc định (hành vi giống như bạn sử dụng lệnh "RUN.EXE")

  3. mở thông qua 'explorer' (hành vi giống như bạn đã viết url bên trong url cửa sổ thư mục của bạn)

[đề xuất tùy chọn] 4. sử dụng vị trí quy trình iexplore để mở url cần thiết

MÃ:

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

và chức năng Trình trợ giúp:

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

Hy vọng tôi đã giúp.


3
Điều tôi băn khoăn là .. tại sao làm cho nó trở nên phức tạp như vậy khi nhiều người làm cho nó trở nên đơn giản để trả lời câu hỏi?
CularBytes

Tại sao không chỉ sử dụng SearchPath thay vì của riêng bạn GetWindowsPath?
ub3rst4r

3
Tại sao trống bắt khối? Nó không phải là một ý tưởng tồi để chỉ nuốt ngoại lệ?
reggaeg Ức

3

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

Tôi có giải pháp cho vấn đề này do tôi có một vấn đề tương tự ngày hôm nay.

Giả sử bạn muốn mở http://google.com từ một ứng dụng chạy với quyền riêng tư của quản trị viên:

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

1
Tôi nên sử dụng tham chiếu / không gian tên nào cho giải pháp này?
Tinh vi, tiến hành vào

1
@SophussyUndceed Tôi tin rằng ProcessStartInfo và Process được đặt trong System.Diagnostics
Francis Lord
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.