2009-06-26 51 views
4

よくあるように、NewWindowイベントハンドラでキャプチャした.NET FrameworkのWebBroswerコントロールにポップアップがあります。Javascript Window.Opener .NET WebBrowserコントロールの新しいウィンドウのNull

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オブジェクトがプロセスでnullであることです。

ページでは、このフィールドを使用してユーザーを元のウィンドウに戻し、フォームの一部の値を入力します。

Window.OpenerオブジェクトをWebBrowserコントロールから次のWebBrowserコントロールに渡すことはできますか?これはうまくいかないと思うが、私は試してみなければならない。

おかげ

+0

「そんな感じですか?コードを投稿するためのあなたのように見えます。投稿してください。 –

+0

申し訳ありませんが、ちょうど私は気付かなかった – Proximo

答えて

4

はい、次の1つのWebBrowserコントロールからいる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.私は以下にSetOpener機能を書き換え、ソリューションのWPFのバージョンを探している人のために、それはまだ実際のだと、チャンスを理解する=非常に小さいが、とにかくです)

+0

ダークマジックの素敵な部分!まさに私が探していたもの。 ありがとうございました! –

+0

コードBindingGlagsにタイプミスがあります。編集しようとしましたが、少なくとも6文字を変更しない限り編集できませんでした。 – GreenKiwi

+0

@GreenKiwi、指摘ありがとう!一定。 –

0

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> 

希望、私はちょうど試用、エラーと無限のグーグルの時間から誰かを救った。

関連する問題