WebBrowserコントロールからリンク先ページを別ウィンドウで表示したい
フォーム内にWebBrowserコントロールを埋め込み、HTMLソースを出力し、フォーム内にHTMLを表示することがあります。その際、WebBrowserコントロール内で処理が完結している場合には問題ありませんが、以下のようなパターンのHTMLソースの場合・・・
リンク<a>タグでブラウザの別ウィンドウを表示させたい
<a href = "https://www.google.com/" target = "_blank">検索ページへ</a>
でも・・・
ユーザ
WebBrowserコントロール上でのリンクをクリックするとIEが開く。
デフォルトで使用しているブラウザはChrome…
PCのデフォルトで使用しているブラウザで開くようにしたい。
デフォルトのブラウザで開くためには System.Diagnostics.Process.Start() で実行。
target = “_blank” 有パターン
WebBrowserコントロール内のリンクをキャンセルさせ、Process.Startで呼び出す形式。
- WebBrowserの「NewWindow」イベントハンドラを追加。
- WebBrowserの「DocumentCompleted」イベントハンドラを追加。
webBrowser1.NewWindow += CancelNewWindow;
webBrowser1.DocumentCompleted += DocumentCompleted;
- 指定されたメソッドを記述。
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);
}
}
}
- 「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 Linktarget = “_blank” 無パターン
target = “_blank”の記述を除去できるのであれば、以下の方法でも対応可能です。