WPFアプリケーションでデフォルトのブラウザーを開き、特定のWebページに移動したいのですが。それ、どうやったら出来るの?
WPFアプリケーションでデフォルトのブラウザーを開き、特定のWebページに移動したいのですが。それ、どうやったら出来るの?
回答:
System.Diagnostics.Process.Start("http://www.webpage.com");
多くの方法の1つ。
受け入れられた回答が.NET Core 3で機能しなくなりました。これを機能させるには、次の方法を使用します。
var psi = new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
};
Process.Start (psi);
(を使用して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;
}
Microsoftは、Visual C#を使用してプログラムでデフォルトのインターネットブラウザーを起動する方法に関するKB305703の記事で説明しています。
トラブルシューティングのセクションを確認することを忘れないでください。
昇格したアプリケーションからWebページを起動することはできません。これにより、0x800004005例外が発生します。これは、explorer.exeおよびブラウザが昇格されていない状態で実行されているためと考えられます。
昇格していないWebブラウザーで昇格したアプリケーションからWebページを起動するには、Mike Fengによって作成されたコードを使用し ます。lpApplicationNameにURLを渡そうとしましたが、うまくいきませんでした。また、lpApplicationName = "explorer.exe"(またはiexplore.exe)およびlpCommandLine = urlでCreateProcessWithTokenWを使用する場合も同様です。
次の回避策は機能します。1つのタスク:Process.Start(url)を持つ小さなEXEプロジェクトを作成し、CreateProcessWithTokenWを使用してこの.EXEを実行します。私のWindows 8 RCでは、これは正常に機能し、Google ChromeでWebページを開きます。
Explorer.exe
昇格に使用することはサポートされていません。それに頼るべきではありません。」
これが私の完全なコードの開き方です。
2つのオプションがあります。
デフォルトのブラウザを使用して開く(動作はブラウザウィンドウ内で開かれるようなものです)
デフォルトのコマンドオプションから開く(「RUN.EXE」コマンドを使用するような動作)
「エクスプローラー」から開く(動作は、フォルダーウィンドウの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;
}
私が助けてくれたことを願っています。
GetWindowsPath
ですか?
古い学校の方法;)
public static void openit(string x) {
System.Diagnostics.Process.Start("cmd", "/C start" + " " + x);
}
使用する: openit("www.google.com");
今日私は同様の問題を抱えているので、これに対する解決策があります。
管理者権限で実行しているアプリからhttp://google.comを開きたいとします。
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo);