javaScript Window.Opener 개체 NULL .NET WebBrowser 컨트롤 새 창
-
20-08-2019 - |
문제
글쎄, 나는 NewWindow 이벤트 핸들러와 함께 캡처하는 .NET 프레임 워크의 WebBroswer 컨트롤에서 팝업이 있습니다.
WebBrowser w = new WebBrowser();
SHDocVw.WebBrowser_V1 web = (SHDocVw.WebBrowser_V1)w.ActiveXInstance;
web.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(web_NewWindow);
새로운 팝업은 웹 브라우저 컨트롤의 새로운 인스턴스와 함께 새로운 형태입니다.
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 객체가 프로세스에서 Null이라는 것입니다.
페이지는 해당 필드를 사용하여 사용자를 원래 창으로 되돌리고 양식의 일부 값을 채 웁니다.
어쨌든 하나의 웹 브라우저 컨트롤에서 다음 웹 브라우저 컨트롤로 Opener 오브젝트를 전달할 수 있습니까? 이것이 효과가있을 것이 불가능 해 보이지만 시도해야합니다.
감사
해결책
예, Window.opener 객체를 하나의 Webbrowser 컨트롤에서 다음에 전달하는 방법이 있습니다.
자세한 내용은 아래 코드를 참조하십시오.
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;
}
}
추신 : 나는 여전히 실제적이고, 매우 작지만, 어쨌든 =)
다른 팁
솔루션의 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;
}
Child Side Webbrowser에서 이벤트 핸들러에서 사용하십시오.
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