我有一个 WPF WebBrowser 控件。用户使用它登录网站并创建会话。当用户单击创建弹出窗口的链接时,会启动新的浏览器(并且会话丢失),因此他们被迫重新进行身份验证。
我通过指定一个事件处理程序来拦截 newWindow2 事件来解决这个问题:
Guid SID_SWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
IServiceProvider serviceProvider = (IServiceProvider)webBrowser.Document;
Guid serviceGuid = SID_SWebBrowserApp;
Guid iid = typeof(SHDocVw.IWebBrowser2).GUID;
SHDocVw.IWebBrowser2 myWebBrowser2 = (SHDocVw.IWebBrowser2) serviceProvider.QueryService(ref serviceGuid, ref iid);
SHDocVw.DWebBrowserEvents2_Event wbEvents2 =(SHDocVw.DWebBrowserEvents2_Event)myWebBrowser2;
wbEvents2.NewWindow2 += new SHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(wbEvents2_NewWindow2);
事件处理程序代码如下:
public void wbEvents2_NewWindow2(ref object ppDisp, ref bool Cancel)
{
popUpWindow = new Window1();
popUpWindow.Show();
popUpWindow.webBrowser.Navigate(new Uri("about:blank"));
Guid SID_SWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
IServiceProvider serviceProvider = (IServiceProvider)popUpWindow.webBrowser.Document;
Guid serviceGuid = SID_SWebBrowserApp;
Guid iid = typeof(SHDocVw.IWebBrowser2).GUID;
SHDocVw.IWebBrowser2 myWebBrowser2 = (SHDocVw.IWebBrowser2)serviceProvider.QueryService(ref serviceGuid, ref iid);
ppDisp = myWebBrowser2.Application;
}
在涉及某些 JavaScript 片段之前,一切都很好。例如,如果生成弹出窗口的链接以这种方式指向 JavaScript 函数:
<a href="javascript:SomeFunction('someParameter','someParameter')">Some link here</a>
并且该函数中的代码恰好打开了窗口,然后设置了一个等于 html 文档的变量并尝试写入该文档,但没有任何内容被写入 WebBrowser 控件中的文档。例如:
Var someVar = window.open(“”,”Parameters”,”Parameters”);
Var someDocument = someVar.document;
someDocument.writeln(“This never ends up in the source of the page loaded in the WebBrowser control”);
如果我注释掉拦截 newWindow2 事件并允许新浏览器启动并重新验证我的用户的代码 - 弹出窗口按预期加载(JavaScript writeln 函数将数据写入文档)。
我希望有人可以向我解释为什么 JavaScript writeln 没有被写入 WPF WebBrowser 控件中显示的文档,和/或建议这样做的方法。