【问题标题】:Hooking IE Events in C#在 C# 中挂钩 IE 事件
【发布时间】:2018-02-14 04:41:30
【问题描述】:

我正在尝试从现有的 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: Specified cast is not valid when stepping into the assignedEvent method.

当我检查this.document 时,parentWindow 的值状态

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

在强制评估后它声明:

'((mshtml.HTMLDocumentClass)this.document).parentWindow' 抛出一个 “System.InvalidCastException”类型的异常。

有什么想法吗?

【问题讨论】:

    标签: c# internet-explorer com


    【解决方案1】:

    这是一个threading 问题。 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;
        };
    }
    

    【讨论】:

    • 感谢您的澄清!
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2013-04-01
    • 2011-03-01
    相关资源
    最近更新 更多