2013-08-03 34 views
16

私は、WindowsフォームアプリケーションにtextBoxとwebBrowserコントロールを持っています。ユーザーがtextBoxにHTMLコードを入力するたびに、WebBrowserコントロールにコンパイルされたフォームが表示されます。このためコード:外部ブラウザのwebBrowserコントロールでリンクを開くにはどうすればよいですか?

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

しかし、私はWebBrowserコントロール内のリンクをクリックしたときに、それは同じWebBrowserコントロールで開きます。私が望むのは、システムのデフォルトのWebブラウザで開くべきだということです。それで、リンククリックを処理するこのWebBrowserコントロールのイベントはありますか?

+0

ウェブブラウザ内のすべてのリンクを 'target =" _ blank "'にするとどうなりますか? – Tombatron

+0

@Tombatron私はちょうどこの質問に新しい答えを掲載しました、それを参照してください。 – Gaugeforever

答えて

21

これを行う最も簡単な方法は、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()); 
} 
+0

ありがとうございました:) –

+0

私は非常に同じ問題を抱え、上記の解決策を試しました。 chromeがデフォルトのブラウザである場合に動作します。しかし、IE 10がデフォルトのブラウザである場合でも、Webブラウザコントロールで開いています。何か案は? – Feroz

+0

私はこの方法も試していますが、リンクに_blankターゲットがある場合、Navigatingイベントは発生しません!私はこの周りに方法を見つけることができません –

3

おそらく、ナビゲートイベントでProcess.Start()を試してみることができますか?

4

Process.StartデフォルトのブラウザでURLを開き、あなただけのナビゲーションをキャンセルするWebBrowserコントロールを教えてくれます。

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

    e.Cancel = true; 
} 

私はサンプルアプリケーションを作成してテストしました。

4

ここでこのコードは動作するはずです:

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

    e.Cancel = true; 
} 

が、私はそれが働いて、それがないことを確認するためにこれを試してみました!

これが役立ちますように! WebBrowserコントロールの内容が変更されたとき、私はこの答えにもっと何かを追加したいと思い

5

だってwebBrowser1_Navigating方法は、毎回実行されます。あなたのケースでは

あなたはに値を設定するたびDocumentTextこのメソッドが呼び出され、何のURLがない場合、そのデフォルト値は程度です:空白。 これもチェックすると、コンテンツがロードされません。

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; 
     } 
    } 
0

誰も彼らで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; 
    } 
関連する問題