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 đó?
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:
System.Diagnostics.Process.Start("http://www.webpage.com");
Một trong nhiều cách.
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);
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;
}
Microsoft giải thích điều đó trong bài viết KB305703 về Cách khởi động trình duyệt Internet mặc định theo chương trình bằng cách sử dụng Visual C # .
Đừng quên kiểm tra phần Xử lý sự cố.
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.
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ó. "
Đây là mã hoàn chỉnh của tôi làm thế nào để mở.
có 2 lựa chọn:
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)
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")
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
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;
}
Hy vọng tôi đã giúp.
GetWindowsPath
?
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);