在.NET WebBrowser控件新窗口的JavaScript Window.Opener对象空
-
20-08-2019 - |
题
嗯,我有一个弹出在.NET Framework的WebBroswer控制我,象这样的NewWindow事件处理程序捕获。
WebBrowser w = new WebBrowser();
SHDocVw.WebBrowser_V1 web = (SHDocVw.WebBrowser_V1)w.ActiveXInstance;
web.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(web_NewWindow);
在新的弹出式窗口与所述web浏览器控件的新实例的新形式。
void web_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
{
Processed = true;
WebBrowser w2 = new WebBrowser();
Form PopUp = new Form();
PopUp.Controls.Clear();
PopUp.Controls.Add(w2);
w2.Dock = DockStyle.Fill;
PopUp.Show();
w2.Navigate(URL);
w2.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(w2_DocumentCompleted);
}
我的问题是,Window.Opener目的是在这个过程中无效。
在页使用了字段返回用户返回到原来的窗口,并填充在表单上的某些值。
反正有从一个web浏览器控件到下一个传Window.Opener对象?似乎是不可能的,这将工作,但我不得不尝试。
由于
解决方案
是,有一种从一个web浏览器控件到下一个传Window.Opener对象。结果 详情参见下面的代码。
public class WebBrowserTest
{
private WebBrowser _wParent;
// entry point
public void Navigate(string url)
{
_wParent = new WebBrowser();
SHDocVw.WebBrowser_V1 v1 = (SHDocVw.WebBrowser_V1)w.ActiveXInstance;
v1.NewWindow += v1_NewWindow;
}
private void v1_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
{
// tell, that we'll open new page by ourselves
Processed = true;
// open page by ourselves
WebBrowser w2 = new WebBrowser();
w2.Navigate(url);
// wait for document will be loaded to do some magic stuff then
w2.DocumentCompleted += w2_DocumentCompleted;
}
// sets opener for popup window
// after document in popup window was loaded
private void w2_DocumentCompleted(object sender, EventArgs e)
{
WebBrowser popup = (WebBrowser)sender;
SetOpener(_wparent, popup);
}
// My most favorite method :)
// Contains exactly that hack, we're talking about
private void SetOpener(WebBrowser opener, WebBrowser popup)
{
HtmlWindow htmlPopup = popup.Document.Window;
HtmlWindow htmlOpener = opener.Document.Window;
// let the dark magic begin
// actually, WebBrowser control is .NET wrapper around IE COM interfaces
// we can get a bit closer to them access by getting reference to
// "mshtml.IHTMLWindow2" field via Reflection
FieldInfo fi = htmlPopup.GetType().GetField("htmlWindow2", BindingFlags.Instance | BindingFlags.NonPublic);
mshtml.IHTMLWindow2 htmlPopup2 = (mshtml.IHTMLWindow2)fi.GetValue(htmlPopup);
mshtml.IHTMLWindow2 htmlOpener2 = (mshtml.IHTMLWindow2)fi.GetValue(htmlOpener);
// opener is set here
htmlPopup2.window.opener = htmlOpener2.window.self;
}
}
P.S。据我所知,有机会,它仍然是实际的,是非常小的,但是,无论如何=)
其他提示
对于那些谁正在寻找的溶液的WPF版本,重写SetOpener函数如下所示:
public static void SetOpener(System.Windows.Controls.WebBrowser opener, System.Windows.Controls.WebBrowser popup)
{
mshtml.IHTMLWindow2 htmlPopup = (popup.Document as mshtml.HTMLDocument).parentWindow;
mshtml.IHTMLWindow2 htmlOpener = (opener.Document as mshtml.HTMLDocument).parentWindow;
htmlPopup.window.opener = htmlOpener.window.self;
}
使用它在事件处理程序的子侧web浏览器:
private void browser_LoadCompleted(object sender, NavigationEventArgs eventArgs)
{
WebBrowser popup = (WebBrowser)sender;
SetOpener(parentWebBrowser, popup);
}
和WPF部分:
<Grid>
<WebBrowser Name="webBrowser" LoadCompleted="browser_LoadCompleted" />
</Grid>
希望我刚试,错误和无尽的谷歌搜索的时间保存别人。
不隶属于 StackOverflow