C# 用C语言钩住IE事件#

C# 用C语言钩住IE事件#,c#,internet-explorer,com,C#,Internet Explorer,Com,我正在尝试从现有IE窗口捕获事件。在下面的代码示例中,我试图在用户单击某个元素时捕获浏览器文档中的mouseClick事件,然后最终返回有关被单击元素的一些属性 public partial class frmBrowserElementBuilder : Form { InternetExplorer ie; public frmBrowserElementBuilder() { InitializeComponent(); } pri

我正在尝试从现有IE窗口捕获事件。在下面的代码示例中,我试图在用户单击某个元素时捕获浏览器文档中的
mouseClick
事件,然后最终返回有关被单击元素的一些属性

public partial class frmBrowserElementBuilder : Form
{
    InternetExplorer ie;
    public frmBrowserElementBuilder()
    {
        InitializeComponent();
    }

    private void frmBrowserElementBuilder_Load(object sender, EventArgs e)
    {
        //create IE
        ie = new InternetExplorer();
        ie.Visible = true;

        //handle document completed
        ie.DocumentComplete += new
      DWebBrowserEvents2_DocumentCompleteEventHandler(DocumentComplete);

    }

    public void DocumentComplete(object pDisp, ref object URL)
    {
        //document was loaded
        //MessageBox.Show("DocumentComplete: " + URL);

        //create event handler and hook onclick from IE
        DHTMLEventHandler onClickHandler = new DHTMLEventHandler(ie.Document);
        onClickHandler.assignedEvent += new DHTMLEvent(this.ie_onClick);
        ie.Document.onclick = onClickHandler;
    }

    private void ie_onClick(mshtml.IHTMLEventObj e)
    {
        //something was clicked
        MessageBox.Show(string.Format("Event Hooked {0}, Qualifier {1}", e.type, e.qualifier));
    }

    public delegate void DHTMLEvent(IHTMLEventObj e);

    [ComVisible(true)]
    public class DHTMLEventHandler
    {
        public DHTMLEvent assignedEvent;

        private mshtml.HTMLDocument document;
        public DHTMLEventHandler(mshtml.HTMLDocument doc)
        {
            //assign to instance of IE document
            this.document = doc;
        }

        [DispId(0)]
        public void Call()
        {
            //call the event
            assignedEvent(this.document.parentWindow.@event); //{System.InvalidCastException: "Specified cast is not valid."}
        }

    }

}
代码编译并按预期触发void Call(),但是,
this.document.parentwindow
的值为
null
,并且是抛出的
System.InvalidCastException:当进入assignedEvent方法时,指定的强制转换无效。

当我检查
this.document
时,
parentWindow
的值表示

函数求值需要运行所有线程

强制评估后,它声明:

“((mshtml.HTMLDocumentClass)this.document).parentWindow”引发了 类型为“System.InvalidCastException”的异常

有什么想法吗?

这是个问题。Call()调用发生在MTA线程上,您无法从MTA线程访问MSHTML。有很多方法可以改变这一点,但最简单的方法是:

public void DocumentComplete(object pDisp, ref object URL)
{
    var events = (HTMLDocumentEvents2_Event)ie.Document;
    events.onclick += (evt) =>
    {
        MessageBox.Show(string.Format("Event Hooked {0}, Qualifier {1}", evt.type, evt.qualifier));
        return false;
    };
}

谢谢你的澄清!