当前位置:编程学习 > C#/ASP.NET >>

通过IOleObject接口获取的IHTMLDocument2对象无法取得parentWindow

如题,我通过ObjectFromLresult方法获取了一个程序中 Webbrower 控件的 IHTMLDocument2 对象,在获取对象的同时可以正常取得 parentWindow 。在注册 DocumentComplete 事件后,然后目标程序重新载入了一个网页后事件响应时 parentWindow 属性就不可以获取了,只能得到了一个 InvalidCastException 错误。

想请教一下有谁有这方面的解决方案吗? --------------------编程问答-------------------- 如果页面中有iframe那么DocumentComplete事件会多次触发

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (string.Compare(e.Url.ToString(), url, true) != 0) return; // 判断一下是否为期望的url
    //...
}
--------------------编程问答-------------------- 谢谢 zswang 的答复。

我的问题在目标程序(已编译的EXE程序)的Webbrowser控件载入网页并触发 SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler 事件时,为什么 IHTMLDocument2 对象无法获取 parentWindow ?再参考了网上的资料后得知 Webbrowser 控件只能在STA模式工作,但我不知道该如何使我的程序或DocumentComplete事件的响应方法工作在STA模式

参考资料:
http://social.msdn.microsoft.com/Forums/en/ieextensiondevelopment/thread/1212c336-95a6-4f2a-8829-197fb3edf7a8 --------------------编程问答-------------------- 有谁能帮忙回答一下这个问题吗?已经困惑了我两个星期了一直无解。
我的主要目标是得到 parentWindow 然后可以执行 execScript 即可。
实在找不到比这更好的方法了。 --------------------编程问答-------------------- 每次都重新获取一次。 --------------------编程问答--------------------
引用 4 楼 zswang 的回复:
每次都重新获取一次。

这个我已经尝试过了,还是会得到相同的错误。 --------------------编程问答-------------------- 放一段测试代码很好的解释了我现在碰到的问题。


using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Forms;
using mshtml;
using SHDocVw;

namespace InternetWebbrowser
{
    class OpenIE
    {
        public OpenIE()
        {
            this.get_IE_Window();
        }

        [STAThread]
        private void get_IE_Window()
        {
            InternetExplorer ie = new InternetExplorerClass();
            object url = "http://www.sina.com.cn";
            object nill = null;
            ie.Visible = true;
            ie.Navigate2(ref url, ref nill, ref nill, ref nill, ref nill);
            ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.IE_DocumentComplete);
        }

        [STAThread]
        void IE_DocumentComplete(object pDisp, ref object URL)
        {
            Console.WriteLine(System.Threading.Thread.CurrentThread.GetApartmentState().ToString());
            try
            {
                ((IHTMLDocument2)((SHDocVw.IWebBrowserApp)pDisp).Document).parentWindow.execScript("alert('Hello World!')", "JavaScript");
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.Message + "\n\r" + exp.Source + "\n\r" + exp.StackTrace);
            }
        }
    }
}
--------------------编程问答-------------------- 可能是我对 [STAThread] 理解的不是很深刻,就在所有的方法上都加上了。原本预计会弹出一个 Hellow World! 对话框的,最后只在 Console 端得到了一个 System.InvalidCastException 错误。有谁可以提示下该如何修复这个错误呢?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,