.NETのWebBrowserコントロール新規ウィンドウでJavaScriptいるwindow.openerオブジェクトヌル

StackOverflow https://stackoverflow.com/questions/1051358

質問

まあ、私はそうのようなメソッドによりNewWindowイベントハンドラをキャプチャする.NET FrameworkのWebBroswerコントロールにポップアップを持っています。

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であるということです。

ページでは、元のウィンドウに戻って、ユーザーを返すために、そのフィールドを使用して、フォーム上のいくつかの値を埋めます。

次の1つのWebBrowserコントロールからいるwindow.openerオブジェクトを渡すためにとにかくありますか?これが動作することは不可能と思われるが、私は試してみてます。

おかげ

役に立ちましたか?

解決

はい、次の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。私はとにかく=)

、、それはまだ実際のだと、チャンスを理解して非常に小さいですが、

他のヒント

ソリューションの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>

希望は私はちょうど裁判、エラーと無限のグーグルの時間から誰かを保存します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top