.net - .NET WebBrowser 控件新窗口上的 Javascript Window.Opener 对象为空

标签 .net javascript webforms webbrowser-control window.opener

好吧,我在 .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);

新的 Popup 是一种新形式,带有 WebBrowser 控件的新实例。

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。

该页面使用该字段将用户返回到原始窗口并在表单上填写一些值。

是否可以将 Window.Opener 对象从一个 WebBrowser 控件传递到下一个控件?这似乎不可能奏效,但我必须尝试。

谢谢

最佳答案

是的,有办法将 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;
    }
}

附注我明白,机会,它仍然是真实的,非常小,但是,无论如何 =)

关于.net - .NET WebBrowser 控件新窗口上的 Javascript Window.Opener 对象为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1051358/

相关文章:

c# - 如果我使用 ASP.NET 标识,我会被 EF 困住吗?

asp.net - Stack Overflow 的迷你分析器

c# - 在基于DLL更改的.NET项目中实现缓存清除的最佳方法是什么?

c# - 无法添加对 SharePoint 列表服务的引用

javascript - 在Python中匹配Javascript转义表单数据

javascript - bootstrap autoHideNavbar 导致 TypeError : undefined is not a function

c# - 性能 : programmatic vs external compilation

c# - 混淆 SqlCommand 和 SqlDataAdapter

javascript - javascript 函数属性 setter 中的延迟

c# - 需要显示使用 web 服务/jquery 返回的数据