[概要] C#のWebBrowser上で「新しいウィンドウで開く」を選択されたときだけリンクを取得する方法
基本的に趣味でC++をやっています。
自分用の簡易ブラウザを作ってみたくてC#を使い始めています。(ただしVC#を使わずにcsc.exeだけで作成)
一応見よう見まねで作っているのですが、どうしても解らないことがあります。
単に表示するだけなら何とかなったのですが、「新しいウィンドウを開く」をユーザが選択したときの挙動が制御できません…
IEだと
リンク(aタグ)の上にカーソルを持っていく
→ 右クリック
→ あるいは「新しいウィンドウで開く」
に相当する処理でリンク先を開こうとするとIEが勝手に起動します。(デフォルトだから当たり前…)
これを「自分用のブラウザ」で表示したいのです。
たとえば 自分用の簡易ブラウザを KanBr.exe (Kan-i-Browser.仮名) としたとき、
最初に KanBr.exe が起動
→ KanBr上で「新しいウィンドウで開く」が選択された
→ サブフォーム( WinAPI だと サブウィンドウ )としてKanBrのフォームを開く
みたいにしたいのです。
恐らく、
リンク上で「新しいウィンドウで開く」が選択された → イベント発生 → イベント上でIEで開くのを制御(抑制) → 自分のSubFormなるもので表示
のようになると予測しているのですが…
調べてみて、WebBrowserのNewWindowイベントなるものを見つけました。
ですが、「リンク先を取得すること」ができません…
※ すべて提示しようととしたら『字数制限』に抵触したので一部省略しています。
C#
1using System; 2using System.Drawing; 3using System.Windows.Forms; 4 5namespace SimpleWebBrowser{ 6 class EntryPoint{ 7 [STAThread] 8 static void Main( string[] args ){ 9 try{ 10 // コマンドライン引数の処理 11 ArgumentsEx argumentsEx = createArgumentsExObject( args ); 12 // メインウィンドウの生成と初期化 13 MainForm mainForm = new MainForm(); 14 mainForm.setCommandLines( argumentsEx ); 15 Application.Run( mainForm ); 16 }catch( System.Exception err ){ 17 MessageBox.Show( err.Message, "例外発生" ); 18 } 19 } 20 21 // コマンドライン引数の処理とオブジェクト生成 22 static ArgumentsEx createArgumentsExObject( string[] args ){ 23 // ここでコマンドライン引数から情報を抜き取ってArgumentsExオブジェクトにセットし、返す 24 } 25 } 26 27 public class ArgumentsEx{ 28 public ArgumentsEx( int width, int height, string defaultPage, string iconPath, bool allow2ControlScriptError ){ 29 this.width_ = width; 30 this.height_ = height; 31 this.defaultPage_ = defaultPage; 32 this.iconPath_ = iconPath; 33 this.allow2ControlScriptError_ = allow2ControlScriptError; 34 } 35 36 public int width(){ return width_; } 37 public int height(){ return height_; } 38 public string defaultPage(){ return defaultPage_; } 39 public string iconPath(){ return iconPath_; } 40 public bool allow2ControlScriptError(){ return allow2ControlScriptError_; } 41 42 private int width_; 43 private int height_; 44 private string defaultPage_; 45 private string iconPath_; 46 private bool allow2ControlScriptError_; 47 } 48 49 abstract class CommonForm : Form{ 50 protected WebBrowser webBrowser1; 51 protected ToolStrip toolStrip1; 52 // 他にもフィールドあり 53 54 protected ArgumentsEx argumentsEx_; 55 56 public CommonForm(){ 57 this.AllowDrop = true; 58 59 // このFormの描画を一時中断 60 this.SuspendLayout(); 61 62 // ツールバーとしてToolStripを生成 63 this.toolStrip1 = new ToolStrip(); 64 65 // ツールバーのレイアウトを一時的停止 66 this.toolStrip1.SuspendLayout(); 67 68 // その他の生成と設定 69 70 71 72 // ツールバーのレイアウト再開 73 this.toolStrip1.ResumeLayout(false); 74 this.toolStrip1.PerformLayout(); 75 76 // WebBrowserコントロールの生成と初期化 77 webBrowser1 = new WebBrowser(); 78 webBrowser1.Dock = DockStyle.Fill; 79 webBrowser1.Name = "webBrowser1"; // コントロールとしてフォーム上に追加 80 this.Controls.Add(webBrowser1); // Webページを表示 81 82 // Webbrowserのイベント登録 83 webBrowser1.Navigated += new WebBrowserNavigatedEventHandler( webBrowser1_Navigated ); 84 webBrowser1.DocumentTitleChanged += new EventHandler( webBrowser1_DocumentTitleChanged ); 85 webBrowser1.CanGoBackChanged += webBrowser1_CanGoBackChanged; 86 webBrowser1.CanGoForwardChanged += webBrowser1_CanGoForwardChanged; 87 // https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13108525433 88 //webBrowser1.DocumentCompleted += webBrowser1_document_completed; 89 // ここで『新しいウィンドウで開く』のイベント設定 90 webBrowser1.NewWindow += webBrowser1_NewWindow; 91 92 // スクロールバーを表示しておく 93 webBrowser1.ScrollBarsEnabled = true; 94 95 webBrowser1.isWebBrowserContextMenuEnabled = false; 96 97 98 // 独自の見栄えに設定 99 onSetUniqueVisual(); 100 101 this.ResumeLayout(false); 102 this.PerformLayout(); 103 104 // ... 105 } 106 107 // 他にもメソッドあり... 108 109 private CommonForm createNewSubForm( ArgumentsEx argumentsEx, string firstPage ){ 110 SubForm res = new SubForm(); 111 res.setCommandLines( argumentsEx ); 112 res.setFirstPage( firstPage ); 113 res.Show(); 114 return res; 115 } 116 117 private void homeToolStripButton_Click( object sender, EventArgs e ){ 118 this.webBrowser1.Navigate( argumentsEx_.defaultPage() ); 119 } 120 121 private void nextToolStripButton_Click( object sender, EventArgs e ){ 122 this.webBrowser1.GoForward(); 123 } 124 125 private void webBrowser1_Navigated( object sender, WebBrowserNavigatedEventArgs e){ 126 this.Text = webBrowser1.Url.ToString(); 127 //this.Text = webBrowser1.DocumentTitle; 128 } 129 130 private void webBrowser1_NewWindow( object sender, System.ComponentModel.CancelEventArgs e){ 131 //MessageBox.Show( webBrowser1.Url.ToString() ); 132 //this.Text = webBrowser1.DocumentTitle; 133 e.Cancel = true; 134 // todo: 恐らくここでリンク先を取得するのだろう… 135 } 136 137 private void webBrowser1_DocumentTitleChanged( object sender, EventArgs e ){ 138 this.Text = webBrowser1.DocumentTitle; 139 } 140 141 private void webBrowser1_CanGoBackChanged( object sender, EventArgs e ){ 142 this.prevToolStripButton.Enabled = webBrowser1.CanGoBack; 143 } 144 145 private void webBrowser1_CanGoForwardChanged( object sender, EventArgs e ){ 146 this.nextToolStripButton.Enabled = webBrowser1.CanGoForward; 147 } 148 149 } 150 151 152 class MainForm : CommonForm{ 153 // ここで実装したり… 154 } 155 156 class SubForm : CommonForm{ 157 // ここでも実装したり... 158 } 159}
実際には「新しいウィンドウで開く」をした時に表示したいのです。
つまり、「新しいウィンドウで開く」をしたときにリンク先のURLを取得して自分のSubFormで開きたいのです。
デフォルトのIEはキャンセルして。
どなたかよろしくお願いいたします。
[情報]
言語: C# (with WinForm)
.NET Frameworkのバージョン: 2.0
IDE: 使わない (直接csc.exeでコンパイル)
[BAについて]
他の方の回答も良かったので皆さんBAにしたかったのですがシステム上不可能なので今回はSurferOnWwwさんの回答をBAとさせて頂きます。
ありがとうございました!
回答3件
あなたの回答
tips
プレビュー