大家有兴趣可以加我QQ群交流:14792063 广州软件开发团队
前几天写的网上订舱辅助系统,物流组反馈如果遇到意外情况,网站弹出交互新窗口,可是内容却看不到.测试后发现是由于新窗口打开在IE中,与当前会话失去了联系,所以要求重新登录,流程不能继续,要解决这个问题,必须要求新打开的网页受控于WebBrowser.
为解决这个问题,先百度后google,发现有好多人在问,可是解决办法大都不可靠,或语焉不详,或文不对题,最后终于找到了一篇文章解决了这个问题.鉴于这个问题的普遍性,我也把解决办法列出来,好让网友搜索时能多一点帮助.
解决办法很简单,分两情况,一是在当前WebBrowser中打开新页面,二是在新Form中的WebBrowser中打开新页面:
代码
public Form1()
{
InitializeComponent();
this.webBrowser1.AllowWebBrowserDrop = false; //可在属性里设置,很重要
//在新Form中的WebBrowser中打开
(this.webBrowser1.ActiveXInstance as SHDocVw.WebBrowser).NewWindow2 += new SHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(Form1_NewWindow2);
//在主WebBrowser中打开
//(this.webBrowser1.ActiveXInstance as SHDocVw.WebBrowser).NewWindow3 += new SHDocVw.DWebBrowserEvents2_NewWindow3EventHandler(Form1_NewWindow3);
}
void Form1_NewWindow2(ref object ppDisp, ref bool Cancel)
{
Form5 frm = new Form5(); //事先建好一个带WebBrowser的窗体
ppDisp = frm.webBrowser1.ActiveXInstance;
frm.Show();
}
void Form1_NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
{
Cancel = true;
this.webBrowser1.Navigate(bstrUrl);
}
{
InitializeComponent();
this.webBrowser1.AllowWebBrowserDrop = false; //可在属性里设置,很重要
//在新Form中的WebBrowser中打开
(this.webBrowser1.ActiveXInstance as SHDocVw.WebBrowser).NewWindow2 += new SHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(Form1_NewWindow2);
//在主WebBrowser中打开
//(this.webBrowser1.ActiveXInstance as SHDocVw.WebBrowser).NewWindow3 += new SHDocVw.DWebBrowserEvents2_NewWindow3EventHandler(Form1_NewWindow3);
}
void Form1_NewWindow2(ref object ppDisp, ref bool Cancel)
{
Form5 frm = new Form5(); //事先建好一个带WebBrowser的窗体
ppDisp = frm.webBrowser1.ActiveXInstance;
frm.Show();
}
void Form1_NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
{
Cancel = true;
this.webBrowser1.Navigate(bstrUrl);
}
然后如果在新窗口打开新页面,主页面和新页面在同一会话中,可互相影响了.
另:SHDocVw.dll 在 C:/WINDOWS/SYSTEM32下,要引用到项目中来,这个是基础,不应该有疑问吧.