IE9的C#BHO中的现场事件处理

本文关键字:事件处理 现场 C#BHO IE9 | 更新日期: 2023-09-27 18:29:53

我正在为IE开发C#BHO插件。插件应该对滚动事件做出反应。负责它的代码如下:

var document = (HTMLDocument)webBrowser.Document;
((HTMLWindowEvents2_Event)document.parentWindow).onscroll += WebBrowserWindowOnScroll;

这种方法在IE7和IE8中效果非常好。但在IE9中完全无用。我找到了这个解决方法:http://social.msdn.microsoft.com/Forums/et-EE/ieextensiondevelopment/thread/808df95a-c559-44c3-93b7-b9e3b2c3b737

看起来它应该解决问题,但不幸的是,它在C++上,我没能在C#上移动它。有人能建议IE9的变通方法吗?或者如何在C#上实现上面提到的方法?

非常感谢!

IE9的C#BHO中的现场事件处理

我设法找到了解决方案。

IHTMLWindow3有一个方法attachEvent,它需要事件名称作为第一个参数(在我的情况下是"onscroll")和负责事件处理的对象。最棘手的部分是与这个处理程序对象连接。它应该实现IDispatch接口,但IE9使用这个接口的方式非常奇怪。它调用IDispatch.Invoke而不指定应调用的方法名。当类由[ClassInterface(ClassInterfaceType.AutoDispatch)]属性标记时,NET自动实现IDispatch,并使用反射根据IDispatch.Invoke的参数调用其实例方法。在我们的情况下,方法名称为空,因此不会调用任何东西[DispId(0)]属性允许解决此问题,它指定了如果Invoke接收到空的方法名称时应该调用的方法。

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class EventListener
{
    [DispId(0)]
    public void HandleEvent(object target)
    {
    }
}

需要说明的是,处理程序方法的名称并不重要。但它的签名很重要。例如,对于"onscroll"事件,它应该如上所示,"onclick"处理程序不需要参数等。