C#の既定のブラウザーで開く方法


258

私は小さなC#アプリケーションを設計していますが、その中にWebブラウザーがあります。現在、コンピューターにすべてのデフォルトがあり、google chromeがデフォルトのブラウザーであると言っていますが、アプリケーションのリンクをクリックして新しいウィンドウで開くと、インターネットエクスプローラーが開きます。代わりに、これらのリンクをデフォルトのブラウザで開く方法はありますか?または、私のコンピュータに何か問題がありますか?

私の問題は、アプリケーションにウェブブラウザがあることです。Googleに移動して「スタックオーバーフロー」と入力し、最初のリンクを右クリックして[新しいウィンドウで開く]をクリックすると、ChromeではなくIEで開きます。これは私が不適切にコーディングしたものですか、それとも私のコンピュータに正しくない設定がありますか?

===編集===

これは本当に迷惑です。ブラウザがIEであることはすでに知っていますが、以前は問題なく動作していました。リンクをクリックすると、Chromeで開きました。c#expressを起動できなかったため、その時点でアプリケーションを作成するためにシャープ開発を使用していました。私は新しいWindowsのインストールを行いましたが、アプリケーションにそれほど遠くないので、最初からやり直すことにしましたが、今はこの問題が発生しています。それが自分のコンピューターかどうかわかりません。なぜデフォルトのブラウザーで新しいリンクを開くのではなく、リンクをクリックしたときにIEがブラウザー全体を起動するのですか?


へへ、IEにChromeを開くように説得するのは少し難しい戦いになるでしょう。まあ、少しではありません。IEを直接実行しても、これは機能しません。または、IEがデフォルトの場合はChromeを使用します。
ハンスパッサント2011年

@SLaks Mono?あなたは何について話していますか?
Sean

1)getstartMenuDir FirefoxまたはChrome StandartName Besureを検索します。見つからない場合。2)これまでに存在した標準のインストール場所のリストを取得します。そうでない場合3)最後の手段は答えを使用します。
bh_earth0

回答:


506

あなただけ書くことができます

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

編集WebBrowserコントロールはIEの埋め込みコピーです。
したがって、その内部のリンクはIEで開きます。

この動作を変更するには、Navigatingイベントを処理します。


1
それを試してみてください。Taskmgr.exeを使用すると、iexporer.exeの2つのコピーが実行されます。アウトプロセスの場合、ナビゲートは発生しません。
ハンスパッサント2011年

4
@ショーン:はい。 Process.Start(e.Url.ToString())
SLaks、2011年

2
ブラウザのexeが最初のパラメータとして指定されていない限り、ローカルURL(file:///)はクエリ文字列では機能しません。
HerrimanCoder 2016

2
この方法でもセキュリティの問題が発生する可能性があることに注意してください。「url」がアプリケーションへの物理パスに置き換えられた場合も実行されます
Gerrie Pretorius

1
@Spencer:URLが信頼できることを確認してください。
SLaks

45

dotnetコアでこの質問を見つけた方。ここで解決策を見つけました

コード:

private void OpenUrl(string url)
{
    try
    {
        Process.Start(url);
    }
    catch
    {
        // hack because of this: https://github.com/dotnet/corefx/issues/10361
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            url = url.Replace("&", "^&");
            Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            Process.Start("xdg-open", url);
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            Process.Start("open", url);
        }
        else
        {
            throw;
        }
    }
}

ありがとう!私にとってはうまくいきます...しかし、macosではopenコマンドの代わりにxdg-open
equiman

@イキマンはそれをしませんか?RuntimeInformation.IsOSPlatform(OSPlatform.OSX)それともLinuxではすでに正しいのでしょうか?
Joel Harkes、2017年

やったよ。ただし、xdg-command「xdg-open:コマンドが見つかりません」を返します。次に、openコマンドでテストして動作します。
エクイマン2017年

@イキマンだから、あなたはそれを機能させるためにelseif linuxとOSXを切り替える必要があると言っていますか、macosはUDNER OSXに該当しませんか?
Joel Harkes、2017年

1
私はそうは思いません...私の解決策は一種の代替手段です。
イクマン2017年

38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

それはあなたの問題を解決するはずです


7
'static void GotoSite'
Behrooz

15

Processここで述べたようにしてみましたか:http : //msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx

あなたは使うことができます

Process myProcess = new Process();

try
{
    // true is the default, but it is important not to set it to false
    myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

1
UseShellExecuteデフォルトはtrueです。
SLaks、2011年

4
@SLaks、ありがとう。一方で、それはそうでなければならないことを述べることは重要trueです。
Andreas

1
チェックするのが面倒な人のために...プロセスには「System.Diagnosticsを使用する」が必要
Nick Roberts

これは、WPFで必要なルートのようです。だけを実行Process.Start(url)しても、新しいブラウザウィンドウは開きません。
-RubyHaus、

5

GeckoFXコントロールを見てください。

GeckoFXは、Mozilla Gecko(Firefox)を.NET Windowsフォームアプリケーションに簡単に埋め込むことができるオープンソースコンポーネントです。完全にコメントされたクリーンなC#で記述されたGeckoFXは、デフォルトのInternet ExplorerベースのWebBrowserコントロールの完全な代替品です。


私の問題は、アプリケーションにウェブブラウザがあることです。Googleに移動して「スタックオーバーフロー」と入力し、最初のリンクを右クリックして[新しいウィンドウで開く]をクリックすると、ChromeではなくIEで開きます。これは私が不適切にコーディングしたものですか、それとも私のコンピュータで正しくない設定がありますか
Sean

@SLaks:なぜあなたはそれを言うのですか?文字列を作成してGetDefaultBrowserPath()に設定するのが難しいとは思いません。
医師、2011年

@Sean:アプリケーション内にWebブラウザーがある場合、デフォルトでIEを使用します。Navigatingイベントは、それを回避するのに役立ちます。
医師、2011年

OPが別のプロセスによって起動されたデフォルトのブラウザーを変更したくないことを理解した後、私は私の回答を変更しました。
医師、2011年

5

これ、昔ながらの方法を試してください;)

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

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


2
「Shellsock」と呼ばれるこれを悪用することはできませんか?
Joseph Lennox

@JosephLennoxそれは素晴らしいポイントです!URLでのSystem.Diagnostics.Process.Startの方が安全ではない(なんでしょうか?)と言っておいたほうがいいでしょう。一方、ユーザーが自分のコンピューターでアプリケーションを実行している場合(おそらくそうです)、ユーザーができる最悪のことは、自分のシステムを破壊することです:P
Ben

4
@Ben入力がどこから来ているかに依存します。共有データソースの場合、ユーザーが悪意のあるコマンドを入力すると、[移動]をクリックした他のすべてのユーザーはそのユーザーのなすがままになります。
Dan Bechard 2016年

4

たくさん調べた後、私は与えられた答えのほとんどがdotnetコアでは機能しないと感じています。1 System.Diagnostics.Process.Start("http://google.com").; -dotnetコアでは動作しません

2.正常に動作しますが、デフォルトのブラウザがクロムの場合、新しいウィンドウが開かなくなります

 myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();

以下は最も単純で、すべてのシナリオで機能します。

Process.Start("explorer", url);

これで解決しました。
Rufw91

3

これは私にとってデフォルトを開きました:

System.Diagnostics.Process.Start(e.LinkText.ToString());

EventArgsにLinkTextのプロパティを提供する、使用しているパッケージはありますか?
Nick Roberts

3

dotnet coreを使用するとエラーがスローされますProcess.Start(URL)。次のコードはで動作しdotnet coreます。の代わりに任意のブラウザを追加できますChrome

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);

3
Qに対する回答ではありません。デフォルトのブラウザーが何であるかはコードには
わかり

0

UWPの場合:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));

これはLauncher.LaunchUriAsyncです。完全な例については、リンクをクリックしてください。興味深いことに、戻り値により、呼び出し元はURLが開かれたかどうかを知ることができます。注意してください、これはWindows 8 / Server2012 / Phone8以降です。古いバージョンとの互換性が必要なソフトウェアは使用できません。
ステフェイン・グーリッホン


0

現在のバージョンのエクスプローラ
@ "Software \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION"でレジストリを更新します

public enum BrowserEmulationVersion
{
    Default = 0,
    Version7 = 7000,
    Version8 = 8000,
    Version8Standards = 8888,
    Version9 = 9000,
    Version9Standards = 9999,
    Version10 = 10000,
    Version10Standards = 10001,
    Version11 = 11000,
    Version11Edge = 11001
}

key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.