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

标签 c# mshtml internet-explorer-9 addeventlistener iwebbrowser2

addEventListener 的 MSDN 文档表示它接受 IDispatch * 对象形式的回调函数。在 C# 中(我使用的是 COM 互操作),Visual Studio 将参数类型显示为 object

我在寻找 IEventListener 接口(interface)或类似的东西,但没有找到。我应该传递什么?

最佳答案

经过一些研究,我了解到这些 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 )。

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


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

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

关于c# - 如何在 IE9 中使用 MSHTML 的 addEventListener 添加事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999247/

相关文章:

html - IE 9 中的 Rapheal 饼图渲染问题

javascript - IE9文本输入焦点异常

c# - 将 C# double 与指定值进行比较是否安全?

c# - 填充属性的通用方法?在 .net 2.0 中如何实现?

c# - ASP.NET 中的 GridView 问题

c# - mshtml.HTMLDocument 如何隐藏具有类属性的动态创建的 div

c# - WPF WebBrowser.Document 属性实际返回哪个对象?

excel - OlAppointment 对象的 HTMLBody 解决方法?

c# - 将时间转换为特定时区然后转换为 UTC 时如何获得偏移量? C#

html - 如何强制 dotnetnuke 渲染到 IE9 中