Web ブラウザー コントロールは、ポップアップ ウィンドウに関する通知を受け取る NewWindow イベントをサポートしています。ただし、Winforms ラッパーでは、多くのことを行うことはできません。ポップアップをキャンセルすることしかできません。ネイティブ COM ラッパーは、Web ブラウザーの新しいインスタンスを返すことを許可します。そのインスタンスは、ポップアップの表示に使用されます。
これを利用するには、いくつかの作業が必要です。まず、[プロジェクト] + [参照の追加] の [参照] タブを使用して、c:\windows\system32\shdocvw.dll を選択します。これにより、ネイティブ COM インターフェイスへの参照が追加されます。
ポップアップ フォームとして機能するフォームを作成します。その上に WebBrowser をドロップし、そのコードを次のようにします。
public partial class Form2 : Form {
public Form2() {
InitializeComponent();
}
public WebBrowser Browser {
get { return webBrowser1; }
}
}
Browser プロパティは、ポップアップ ウィンドウに Web ページを表示するために使用されるブラウザーへのアクセスを提供します。
ここでメインフォームに戻ります。その上に WebBrowser をドロップし、そのコードを次のようにします。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
webBrowser1.Url = new Uri("http://google.com");
}
SHDocVw.WebBrowser nativeBrowser;
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
nativeBrowser = (SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;
nativeBrowser.NewWindow2 += nativeBrowser_NewWindow2;
}
protected override void OnFormClosing(FormClosingEventArgs e) {
nativeBrowser.NewWindow2 -= nativeBrowser_NewWindow2;
base.OnFormClosing(e);
}
void nativeBrowser_NewWindow2(ref object ppDisp, ref bool Cancel) {
var popup = new Form2();
popup.Show(this);
ppDisp = popup.Browser.ActiveXInstance;
}
}
OnLoad メソッドは、ネイティブ COM インターフェイスへの参照を取得し、イベント ハンドラーを NewWindow2 イベントにサブスクライブします。FormClosing イベント ハンドラーでそのイベントのサブスクライブを解除したことを確認しましたが、それが必要かどうかは 100% わかりません。申し訳ありませんが安全です。
NewWindow2 イベント ハンドラーが重要です。最初の引数で、型指定されていない参照を返すことができることに注意してください。これは、ポップアップ ウィンドウのネイティブ ブラウザである必要があります。そこで、Form2 のインスタンスを作成し、それを Show() します。ポップアップが所有されたウィンドウであることを保証する Show() の引数に注意してください。アプリの必要に応じてこれを置き換えます。この場合、MDI 子ウィンドウを作成する必要があると思います。
Javascript が alert() を使用するときに表示されるウィンドウに対して、このイベントが発生しないことに注意してください。ブラウザはそのウィンドウを HTML ポップアップとして処理せず、ブラウザ ウィンドウを使用して表示しないため、傍受したり置き換えたりすることはできません。