Элемент управления веб-браузера поддерживает событие NewWindow, чтобы получать уведомления о всплывающем окне. Обертка Winforms, однако, не позволяет вам делать с ней многое, вы можете только отменить всплывающее окно. Собственная оболочка COM позволяет передавать новый экземпляр веб-браузера, который затем будет использоваться для отображения всплывающего окна.
Чтобы воспользоваться этим, нужно потрудиться. Для начала используйте Project + Add Reference, вкладку Browse и выберите c: \ windows \ system32 \ shdocvw.dll. Это добавляет ссылку на собственный интерфейс COM.
Создать форму, которая действует как всплывающая форма. Поместите веб-браузер на него и сделайте его код похожим на это:
public partial class Form2 : Form {
public Form2() {
InitializeComponent();
}
public WebBrowser Browser {
get { return webBrowser1; }
}
}
Свойство Browser предоставляет доступ к браузеру, который будет использоваться для отображения веб-страницы во всплывающем окне.
Теперь вернемся к основной форме. Поместите на него 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 и не использует окно браузера для его отображения, поэтому вы не можете перехватить или заменить его.