MSDN 文档addEventListener
说它接受IDispatch *
对象形式的回调函数。在 C#(我正在使用 COM 互操作)中,Visual Studio 将参数类型显示为object
.
我寻找了一个IEventListener
界面或类似的东西,但没有找到。我应该传递什么?
MSDN 文档addEventListener
说它接受IDispatch *
对象形式的回调函数。在 C#(我正在使用 COM 互操作)中,Visual Studio 将参数类型显示为object
.
我寻找了一个IEventListener
界面或类似的东西,但没有找到。我应该传递什么?
经过一番研究,我了解到这些 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) { ... }
}
由于DispId(0)
指定了要调用的默认方法,因此方法的实际名称无关紧要。但是,方法参数确实很重要。例如,IHTMLElement.onclick
必须为没有参数的回调分配一个回调,而IHTMLElement2.attachEvent
接受一个带有一个类型参数的回调IHTMLEventObj
(或IHTMLEventObj2
,...,,6
甚至只是object
)。
总之,COMIDispatch
回调可以在 C# 中使用 COM 可见类来实现,该类具有接受正确参数并用[DispId(0)]
.
尽管如此,避免 W3C DOM 事件 API 的解决方案可能更合适,因为 IE9 DOM 对象在浏览器使用较低文档模式以实现兼容性时不支持此方法。例如,addEventListener
在 IE7 模式下呈现的 Bing 之类的页面上,使用的扩展程序将失败。
IWebBrowser2
除了通过 F12 开发人员工具手动设置之外,似乎也无法设置实例使用的文档模式。