如何在IE9中使用MSHTML的addEventListener添加事件监听器?

ide*_*ide 5 c# mshtml iwebbrowser2 addeventlistener internet-explorer-9

MSDN文档addEventListener说它接受一个IDispatch *对象形式的回调函数.从C#(我正在使用COM互操作),Visual Studio将参数类型显示为just object.

我找了一个IEventListener类似的接口或类似但没有找到一个.我应该传递什么?

ide*_*ide 5

经过一些研究,我了解到这些COM连接点(事件处理程序)是用DispId(0).回调函数由类的实例表示,如:

// These attributes may be optional, depending on the project configuration.
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class EventListener
{
    [DispId(0)]
    // The "target" parameter is an implementation detail.
    public void NameDoesNotMatter(object target, IDOMEvent evt) { ... }
}
Run Code Online (Sandbox Code Playgroud)

由于DispId(0)指定了要调用的默认方法,因此该方法的实际名称无关紧要.但是,方法参数肯定很重要.例如,IHTMLElement.onclick必须为不带参数的回调分配,同时IHTMLElement2.attachEvent使用一个类型的参数IHTMLEventObj(或IHTMLEventObj2,... 6,或甚至只是object)进行回调.

总之,COM IDispatch回调可以在C#中使用COM-visible类实现,该类具有接受正确参数并使用注释的方法[DispId(0)].


尽管如此,避免使用W3C DOM Events API的解决方案可能更合适,因为当浏览器使用较低文档模式以实现兼容性时,IE9 DOM对象不支持此方法.例如,使用的扩展addEventListener名将在Bing等页面上失败,该页面以IE7模式呈现.

IWebBrowser2除了通过F12开发人员工具手动执行此操作外,似乎也无法设置实例使用的文档模式.