web-dev-qa-db-ja.com

外部ブラウザのwebBrowserコントロールでリンクを開く方法は?

WindowsフォームアプリケーションにtextBoxとwebBrowserコントロールがあります。ユーザーがtextBoxにHTMLコードを入力するたびに、webBrowserコントロールはコンパイルされたフォームを表示します。このためのコード:

private void textBox2_TextChanged(object sender, EventArgs e)
{
    webBrowser1.DocumentText = textBox2.Text;
}

しかし、webBrowserコントロールのリンクをクリックすると、同じwebBrowserコントロールでリンクが開きます。私が欲しいのは、システムのデフォルトのWebブラウザで開く必要があるということです。では、リンクのクリックを処理するこのwebBrowserコントロールのイベントはありますか?

18
Shiva Pareek

これを行う最も簡単な方法は、 Navigating イベントをインターセプトすることです。

public void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    //cancel the current event
    e.Cancel = true;

    //this opens the URL in the user's default browser
    Process.Start(e.Url.ToString());
}
24
keyboardP

この答えにもっと何かを追加したいと思います、

Coz webBrowser1_Navigatingメソッドは、webBrowserのコンテンツが変更されるたびに実行されます。

あなたの場合、値をDocumentTextに設定すると、このメソッドが呼び出され、rlがなく、デフォルト値がabout:blankの場合に呼び出されます。したがって、これもチェックする必要があります。そうしないと、コンテンツが読み込まれません。

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        if (!(e.Url.ToString().Equals("about:blank", StringComparison.InvariantCultureIgnoreCase)))
        {
            System.Diagnostics.Process.Start(e.Url.ToString());
            e.Cancel = true;
        }
    }
8
Trikaldarshi

Process.StartはデフォルトのブラウザでURLを開き、WebBrowserコントロールにナビゲーションをキャンセルするように指示するだけです。

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    Process.Start(e.Url.ToString());

    e.Cancel = true;
}

私はそれをテストするためのサンプルアプリを作成しました-それは機能しました。

4
Grant

ここのこのコードは機能するはずです:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    System.Diagnostics.Process.Start(e.Url.ToString());

    e.Cancel = true;
}

私はそれが機能することを確認するためにこれを試しました、そしてそれは機能します!

お役に立てれば!!

4
Dozer789

おそらく、NavigatingイベントでProcess.Start()を使用してみることができますか?

3
Percywaffle

target="_blank"が含まれているリンクに対して適切な回答をした人は誰もいないからです。私はそうしようとします。

まず、なぜこれが機能しないのですか?ユーザーがWebブラウザーコントロールのリンクをクリックしても、ナビゲートイベントは発生せず、新しいウィンドウイベントが発生します。新しいウィンドウイベントでは、新しいウィンドウを中断してデフォルトのウィンドウを開くためにクリックされたURLまたは要素にアクセスできません。これがあなたのやり方です。

まず、ドキュメントの完了イベントに次のコードを追加します。

    private void webBrowserControl_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        string tagUpper = "";

        foreach (HtmlElement tag in (sender as WebBrowser).Document.All)
        {
            tagUpper = tag.TagName.ToUpper();

            if((tagUpper == "AREA") || (tagUpper == "A"))
            { 
                tag.MouseUp += new HtmlElementEventHandler(this.link_MouseUp);
            }
        }
    }

これは、すべてのhtml要素タグを調べて、ifステートメントで定義したすべてのタグを検索します。私の場合、AREAタグも必要でした。好きなタグをキャッチできます。次に、その要素にクリックイベントを添付します。

次に、このコードを使用してイベント自体を作成します。

    void link_MouseUp(object sender, HtmlElementEventArgs e)
    {
        Regex pattern = new Regex("href=\\\"(.+?)\\\"");
        Match match = pattern.Match((sender as HtmlElement).OuterHtml);
        string link = match.Groups[1].Value;

        Process.Start(link);
    }

このコードは正規表現パターンを確立します必要に応じてこのパターンを変更する必要があります。ここにブレークポイントを追加して、正規表現がどのように見えるかを確認することをお勧めします。 regex link で正規表現をテストできます。グループ化には必ず括弧を使用してください。また、貪欲に一致しないように疑問符を使用することをお勧めします。次に、そのパターンを照合し、照合のグループからURLを取得します。その後は、そのURLでプロセスを開始するだけです。これにより、デフォルトのブラウザが開きます。デフォルトのブラウザがすでに開いている場合は、新しいタブが追加されます。

最後に行う必要があるのは、リンクのデフォルトロジックをキャンセルすることです。これは、NewWindowイベントで次のコードを使用して行います。

    private void webBrowserControl_NewWindow(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
    }
1
Gaugeforever