Chcę, aby moja aplikacja WPF otwierała domyślną przeglądarkę i przechodziła do określonej strony internetowej. W jaki sposób mogę to zrobić?
Chcę, aby moja aplikacja WPF otwierała domyślną przeglądarkę i przechodziła do określonej strony internetowej. W jaki sposób mogę to zrobić?
Odpowiedzi:
System.Diagnostics.Process.Start("http://www.webpage.com");
Jeden z wielu sposobów.
Zaakceptowana odpowiedź nie działa już w .NET Core 3 . Aby to zadziałało, użyj następującej metody:
var psi = new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
};
Process.Start (psi);
Chociaż podano dobrą odpowiedź (używając Process.Start
), bezpieczniej jest zamknąć ją w funkcji, która sprawdza, czy przekazany ciąg jest rzeczywiście identyfikatorem URI, aby uniknąć przypadkowego uruchomienia przypadkowych procesów na maszynie.
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;
}
Firma Microsoft wyjaśnia to w artykule KB305703 dotyczącym programowego uruchamiania domyślnej przeglądarki internetowej przy użyciu języka Visual C # .
Nie zapomnij sprawdzić sekcji Rozwiązywanie problemów.
Nie można uruchomić strony internetowej z poziomu aplikacji. Spowoduje to zgłoszenie wyjątku 0x800004005, prawdopodobnie dlatego, że program explorer.exe i przeglądarka nie mają podwyższonego poziomu uprawnień.
Aby uruchomić stronę internetową z aplikacji z podwyższonym poziomem uprawnień w przeglądarce internetowej bez uprawnień, użyj kodu stworzonego przez Mike'a Fenga . Próbowałem przekazać adres URL do lpApplicationName, ale to nie zadziałało. Również nie wtedy, gdy używam CreateProcessWithTokenW z lpApplicationName = "explorer.exe" (lub iexplore.exe) i lpCommandLine = url.
Następujące obejście działa: Utwórz mały projekt EXE, który ma jedno zadanie: Process.Start (url), użyj CreateProcessWithTokenW, aby uruchomić ten plik .EXE. Na moim Windows 8 RC to działa dobrze i otwiera stronę internetową w Google Chrome.
Explorer.exe
do obniżania uprawnień nie jest obsługiwane: „Niestety, zespół Windows Shell odpowiedział, że obecne zachowanie programu„ Explorer.exe AppName.exe ”jest błędem i może nie działać w przyszłych aktualizacjach / wersjach systemu Windows. Aplikacje nie powinni na nim polegać ”.
Oto mój kompletny kod, jak otworzyć.
istnieją 2 opcje:
otwórz za pomocą domyślnej przeglądarki (zachowanie jest podobne do otwierania w oknie przeglądarki)
otwórz za pomocą domyślnych opcji poleceń (zachowanie jest podobne do polecenia „RUN.EXE”)
otwórz za pomocą `` eksploratora '' (zachowanie jest takie, jak w przypadku wpisania adresu URL w adresie URL okna folderu)
[sugestia opcjonalna] 4. Użyj lokalizacji procesu iexplore, aby otworzyć wymagany adres 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;
}
Mam nadzieję, że pomogłem.
GetWindowsPath
?
Stara szkoła;)
public static void openit(string x) {
System.Diagnostics.Process.Start("cmd", "/C start" + " " + x);
}
Posługiwać się: openit("www.google.com");
Mam na to rozwiązanie, bo mam dziś podobny problem.
Załóżmy, że chcesz otworzyć http://google.com z aplikacji działającej z uprawnieniami administratora:
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo);