アプリケーションからWebページを開く方法は?


126

WPFアプリケーションでデフォルトのブラウザーを開き、特定のWebページに移動したいのですが。それ、どうやったら出来るの?

回答:


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

多くの方法の1つ。


3
これも使用しましたが、UACでは機能しないことがわかりました。私のアプリケーションでは、これをマニフェスト<requestedExecutionLevel level = "requireAdministrator" uiAccess = "false" />に持っています。Windows8(UACを無効にできない)でアプリを実行すると、Webページを開くときに次の例外が発生します:Win32Exception(0x80004005):System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer

requireAdministratorをasInvokerに変更しても、この効果は起こりません。しかし、その後アプリは昇格されません:-(
lvmeijer

4
これは、ユーザー入力から誤ってURLを取得し、それがURIであることを検証しない場合、アプリケーションにかなり大きなセキュリティホールを開く可能性があります。その後、システム上で必要なアプリケーションを起動できます。
cdiggins 2015年

1
参考:Unity、Mono、Os XおよびWindowsで動作します。iOSでは機能しません。他のテストはしていません。
Grant M

2
ローカルのhtmlファイルを開くのはどうですか?
guogangj

34

私はこの行を使用してデフォルトのブラウザを起動しています:

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

1
この答えは重複しています。
MAXE

1
@MAXE 2つの回答が同じ時間に作成されました。
4424dev

20

受け入れられた回答が.NET Core 3で機能しなくなりました。これを機能させるには、次の方法を使用します。

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

19

(を使用して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;
}


6

昇格したアプリケーションから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ページを開きます。


1
コメントを参照してください。Explorer.exe昇格に使用することはサポートされていません。それに頼るべきではありません。」
Carl Walsh

4

これが私の完全なコードの開き方です。

2つのオプションがあります。

  1. デフォルトのブラウザを使用して開く(動作はブラウザウィンドウ内で開かれるようなものです)

  2. デフォルトのコマンドオプションから開く(「RUN.EXE」コマンドを使用するような動作)

  3. 「エクスプローラー」から開く(動作は、フォルダーウィンドウの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;
    }

私が助けてくれたことを願っています。


3
私が思っているのは..さまざまな人々がすでに質問に答えるのを簡単にしてしまったのに、なぜそんなに複雑にするのですか?
CularBytes 2014

自分の代わりにSearchPathを使用しないのはなぜGetWindowsPathですか?
ub3rst4r 2014

3
なぜ空のキャッチブロック?例外を飲み込むことは悪い考えではありませんか?
reggaeguitar 2015年

3

古い学校の方法;)

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

使用する: openit("www.google.com");


2

今日私は同様の問題を抱えているので、これに対する解決策があります。

管理者権限で実行しているアプリからhttp://google.comを開きたいとします。

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

1
このソリューションにはどの参照/名前空間を使用すればよいですか?
洗練さ

1
@SophisticatedUndoing ProcessStartInfoとProcessはSystem.Diagnosticsにあると思います
Francis Lord
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.