質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

3177閲覧

C#でのWebBrowserで「新しいウィンドウを開く」を選択されたとき、自分用のブラウザソフトで表示する方法

BeatStar

総合スコア4962

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/10/17 08:29

編集2020/10/20 06:56
[概要] 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とさせて頂きます。

ありがとうございました!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/10/17 10:35

hihijijiさん、ありがとうございます。 そういうのもあるんですね。外出先(?)からなので自分のPCに戻り次第試してみます!
guest

回答3

0

ベストアンサー

NET Framework の WebBrowser を拡張して NewWindow2 イベントを利用し、そのイベントハンドラで新たに WebBrowser を実装した Form を初期化してそれに表示するということでよければ、以下の記事が参考になりませんか?(8 年前の記事で、今でも同じことができるかどうかは未確認ですが)

WebBrowser の拡張
http://surferonwww.info/BlogEngine/post/2012/07/01/extension-of-webbrowser-control.aspx

フルに拡張するなら上の記事からリンクが貼ってある以下の記事が参考になると思います。

Extended .NET 2.0 WebBrowser Control
https://www.codeproject.com/Articles/13598/Extended-NET-2-0-WebBrowser-Control

他には、SDK に含まれている Aximp.exe (Windows フォーム ActiveX コントロールインポーター) を使って SHDocVw.dll と AxSHDocVw.dll を作ってそれを使うとか。詳しくは以下の記事を見てください。

SHDocVw.dll と AxSHDocVw.dll の作り方と使い方
http://surferonwww.info/BlogEngine/post/2012/06/23/how-to-produce-and-use-shdocvw-and-axshdocvw.aspx

AxSHDocVw.dll(Windows フォームプロキシ)の C# ソースを生成するオプションがあるので、ソースを作って中身を見るといろいろ参考になると思います。

投稿2020/10/18 00:18

編集2020/10/18 00:33
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/10/20 06:51

ご回答ありがとうございます! 確かに一番上のURL先のやつで出来ました!
guest

0

CWebBrowser.NewWindowイベントのURLを取得する[duplicate] - c#、browser、new-window
WebBrowserを拡張してWebBrowser2イベントを拾う際にInvalidActiveXStateExceptionが出てしまいます。
こちらの質問が参考になりませんか?

ようはWebBrowserコントロールを拡張してNewWindow2イベントやNewWindow3イベントを取得して処理するといったやり方です。

投稿2020/10/17 09:24

編集2020/10/17 09:50
YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/10/17 12:31

ご回答ありがとうございます。 試してみます
guest

0

こんにちは。

少し見方を変えて、IE由来の右クリックメニューを無効にして、自分で右クリックメニューを実装する…というのはいかがでしょうか。
デフォルトの右クリックメニューは以下のカードで無効化できるそうです。

C#

1webBrowser1. IsWebBrowserContextMenuEnabled = false;

BeatStarさんの提示された右クリックメニューの項目を選択したときのイベントを受け取る方法は、恐らくWinAPIを使用すれば実現できると思います(ウィンドウメッセージを監視するとか)。
私はそちらの方向には精通していないので、詳しくは分からないです……ごめんなさい。

投稿2020/10/17 08:51

Automatic9045

総合スコア313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/10/17 10:38 編集

ご回答ありがとうございます。 >> IE由来の右クリックメニューを無効にして、... あー、そっちもありましたか…。でもそれをやると他の『エンコード』とか『印刷』とかのようなものが出来ないんですよね… (まあ、自分で実装…できなくもなさそうだけど、相当めんどそう…) 一応、最悪の場合(できなかった場合)はこれも候補に入れておきますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問