2009-06-26 36 views
4

嗯,我有一個彈出窗口的WebBroswer控件的.NET框架,我用NewWindow事件處理程序捕獲像這樣。Javascript的Window.Opener對象.NET上的WebBrowser控件的新窗口

WebBrowser w = new WebBrowser(); 
SHDocVw.WebBrowser_V1 web = (SHDocVw.WebBrowser_V1)w.ActiveXInstance; 
web.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(web_NewWindow); 

新的彈出窗口是一個新的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對象在進程中爲空。

頁面使用該字段將用戶返回到原始窗口並填寫表單上的一些值。

無論如何要將Window.Opener對象從一個WebBrowser控件傳遞到下一個?似乎不可能,這將工作,但我必須嘗試。

由於

+0

「像這樣」?看起來你需要發佈代碼。請張貼它。 – 2009-06-26 23:57:11

+0

好吧,短短一秒我沒有注意到 – Proximo 2009-06-27 00:06:14

回答

4

是的,有一種從一個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.據我所知,有機會,它仍然是實際的,是非常小的,但是,無論如何=)

0

對於那些誰正在尋找解決方案的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; 
} 

使用它在對孩子邊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> 

希望我從試用時間,錯誤和無盡的谷歌搜索中拯救了別人。

相關問題