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属性提供对浏览器的访问,该浏览器将用于在弹出窗口中显示网页。
现在回到主要形式。将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弹出窗口,也不使用浏览器窗口来显示它,因此您无法截取或替换它。



