在 C# 中挂钩 IE 事件
Hooking IE Events in C#
我正在尝试从现有 IE window 捕获事件。在下面的代码示例中,我试图在用户单击某个元素时在浏览器文档中捕获 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
的值表示
The function evaluation requires all threads to run.
在强制求值后它指出:
'((mshtml.HTMLDocumentClass)this.document).parentWindow' threw an
exception of type 'System.InvalidCastException'.
有什么想法吗?
这是一个 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;
};
}
我正在尝试从现有 IE window 捕获事件。在下面的代码示例中,我试图在用户单击某个元素时在浏览器文档中捕获 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
的值表示
The function evaluation requires all threads to run.
在强制求值后它指出:
'((mshtml.HTMLDocumentClass)this.document).parentWindow' threw an exception of type 'System.InvalidCastException'.
有什么想法吗?
这是一个 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;
};
}