WebBrowserコントロールからの外部ページへのリンク

Sponsored Link

WebBrowserコントロールからリンク先ページを別ウィンドウで表示したい

 フォーム内にWebBrowserコントロールを埋め込み、HTMLソースを出力し、フォーム内にHTMLを表示することがあります。その際、WebBrowserコントロール内で処理が完結している場合には問題ありませんが、以下のようなパターンのHTMLソースの場合・・・

リンク<a>タグでブラウザの別ウィンドウを表示させたい

<a href = "https://www.google.com/" target = "_blank">検索ページへ</a>

 でも・・・

ユーザ
ユーザ

WebBrowserコントロール上でのリンクをクリックするとIEが開く。

デフォルトで使用しているブラウザはChrome…

PCのデフォルトで使用しているブラウザで開くようにしたい。

デフォルトのブラウザで開くためには System.Diagnostics.Process.Start() で実行。

Sponsored Link

target = “_blank” 有パターン

 WebBrowserコントロール内のリンクをキャンセルさせ、Process.Startで呼び出す形式。

  1. WebBrowserの「NewWindow」イベントハンドラを追加。
  2. WebBrowserの「DocumentCompleted」イベントハンドラを追加。
webBrowser1.NewWindow += CancelNewWindow;
webBrowser1.DocumentCompleted += DocumentCompleted;
  1. 指定されたメソッドを記述。
private void CancelNewWindow(object sender, System.ComponentModel.CancelEventArgs e)
{
    // 新しいウィンドウを開かせない
    e.Cancel = true;
}

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    foreach (HtmlElement tag in (sender as WebBrowser).Document.All)
    {
        // HTMLから「A」タグ要素のみ取得
        if (tag.TagName.ToUpper() == "A")
        {
            string link = GetLink(tag.OuterHtml);
            // メール送信用のAタグは除外
            if (!link.StartsWith("mailto:"))
                // 対象のAタグにイベントハンドラを追加
                tag.MouseUp += new HtmlElementEventHandler(link_MouseUp);
        }
    }
}
  1. 「DocumentCompleted」内で追加したイベントハンドラ用のメソッドを追加
private void link_MouseUp(object sender, HtmlElementEventArgs e)
{
    // Aタグに記載されたリンク文字列を取得
    string link = GetLink((sender as HtmlElement).OuterHtml);

    if (link.StartsWith("mailto:")) { }
        // メールアドレスはURL生成対象外
    else if (link.StartsWith("http")) { }
        // 絶対パス:httpからの指定は既にURLなので対象外
    else
        // 相対パス:URL生成
        link = GetCurrentURlDir(webBrowser1.Url.AbsoluteUri) + "/" + link;

    // リンク呼び出し
    Process.Start(link);
}

private string GetLink(string outerHtml)
{
    Regex pattern = new Regex("href=\\\"(.+?)\\\"");
    Match match = pattern.Match(outerHtml);
    string link = match.Groups[1].Value;

    return link;
}

// 相対パスの場合は上位のディレクトリ文字列を取得
private string GetCurrentURlDir(string URL)
{
    for (int i = URL.Length - 1; i >= 0; i--)
    {
        if (URL[i] == '/')
        {
            URL = URL.Substring(0, i);
            break;
        }
    }
    return URL;
}
Sponsored Link

target = “_blank” 無パターン

target = “_blank”の記述を除去できるのであれば、以下の方法でも対応可能です。

タイトルとURLをコピーしました