如何使用sdocvw.dll在c#中侦听任何DOM事件
我正在尝试连接到Internet Explorer并向任何DOM事件(包括自定义事件)添加侦听器。如何做到这一点? 我正在尝试此变体,但没有任何结果:如何使用sdocvw.dll在c#中侦听任何DOM事件,c#,internet-explorer,events,dom,C#,Internet Explorer,Events,Dom,我正在尝试连接到Internet Explorer并向任何DOM事件(包括自定义事件)添加侦听器。如何做到这一点? 我正在尝试此变体,但没有任何结果: //... using mshtml; using SHDocVw; using System.Windows.Browser; class Test { public Test(){ IWebBrowser2 browser = BrowserHelper.GetBrowserInstance(); va
//...
using mshtml;
using SHDocVw;
using System.Windows.Browser;
class Test {
public Test(){
IWebBrowser2 browser = BrowserHelper.GetBrowserInstance();
var a = browser.Document as HTMLDocument;
mydelegate obj = this.somefunction;
a.attachEvent("onclick", obj);
}
public delegate void mydelegate(object sender, HtmlEventArgs args);
public void somefunction(object sender, HtmlEventArgs args)
{
MessageBox.Show("Clicked!");
}
}
BrowserHelper返回正确的浏览器实例。这适用于我,无需直接使用SHDOCVW。我不知道从DOM获取自定义事件的解决方案。如果您知道要侦听的自定义事件列表,则可以很容易地完成
private void webBrowser1_DocumentCompleted(
object sender,
WebBrowserDocumentCompletedEventArgs e)
{
// obtain HtmlDocument
HtmlDocument htmlDoc = webBrowser1.Document;
// loop over ALL elements in HtmlDoc
foreach(HtmlElement element in htmlDoc.All)
{
// for the HtmlElements type fetch its suported Events
// from the typeinfo
// we use a LinqQuery to filter in the future
var listOfEvents = from domInt in element.GetType().GetEvents()
// where domInt.Name.Contains("click")
select domInt;
// iterated over the EventMembers
foreach (var htmlevent in listOfEvents)
{
// invoke .Net managed AddEventHandler
htmlevent.AddEventHandler(
element,
new HtmlElementEventHandler(GenericDomEvent));
}
}
}
// do usefull stuff with the even raised
private void GenericDomEvent(object sender, HtmlElementEventArgs e)
{
Debug.WriteLine(e.EventType);
}
这对我来说很有效,没有直接使用SHDOCVW。我不知道从DOM获取自定义事件的解决方案。如果您知道要侦听的自定义事件列表,则可以很容易地完成
private void webBrowser1_DocumentCompleted(
object sender,
WebBrowserDocumentCompletedEventArgs e)
{
// obtain HtmlDocument
HtmlDocument htmlDoc = webBrowser1.Document;
// loop over ALL elements in HtmlDoc
foreach(HtmlElement element in htmlDoc.All)
{
// for the HtmlElements type fetch its suported Events
// from the typeinfo
// we use a LinqQuery to filter in the future
var listOfEvents = from domInt in element.GetType().GetEvents()
// where domInt.Name.Contains("click")
select domInt;
// iterated over the EventMembers
foreach (var htmlevent in listOfEvents)
{
// invoke .Net managed AddEventHandler
htmlevent.AddEventHandler(
element,
new HtmlElementEventHandler(GenericDomEvent));
}
}
}
// do usefull stuff with the even raised
private void GenericDomEvent(object sender, HtmlElementEventArgs e)
{
Debug.WriteLine(e.EventType);
}
谢谢你的回答,不幸的是,我还不能投票——我是这里的新手。)但是,我可以使用webBrowser处理现有Internet Explorer的DOM事件(是的,我有自定义事件列表),还是必须在表单中的webBrowser控件中打开文档并强制用户在其中工作?感谢您的回答,不幸的是,我还不能投票-我是这里的新手。)但是,我可以使用webBrowser处理现有Internet Explorer的DOM事件(是的,我有自定义事件列表),还是必须在表单中的webBrowser控件中打开文档并强制用户在其中工作?