Обработка событий на скролле - PullRequest
0 голосов
/ 02 апреля 2012

Я работаю над плагином C # BHO для IE.Плагин должен реагировать на событие прокрутки.Ниже приведен код, отвечающий за это:

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 #?

Большое спасибо!

1 Ответ

0 голосов
/ 04 апреля 2012

Мне удалось найти решение.

IHTMLWindow3 имеет метод attachEvent , для которого в качестве первого аргумента требуется имя события (в моем случае - «onscroll»)) и объект, который будет отвечать за обработку событий.Самая хитрая часть связана с этим объектом-обработчиком.Он должен реализовывать интерфейс IDispatch , но IE9 использует этот интерфейс довольно странным образом.Он вызывает IDispatch.Invoke без указания имени метода, который должен быть вызван..NET автоматически реализует IDispatch , когда класс помечен [ClassInterfaceType.AutoDispatch)] и использует отражение для вызова своих методов экземпляра в соответствии с аргументами IDispatch.Invoke .В нашем случае имя метода пустое, поэтому ничего не вызывается [DispId (0)] атрибут позволяет решить эту проблему, он определяет метод, который должен вызываться, если Invoke получает пустое имя метода.

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

    }
}

Следует отметить, что имя обработчикаметод не имеет значения.Но его подпись важна.Например, для события «onscroll» оно должно быть таким, как показано выше, обработчик «onclick» не требует аргументов и т. д.

...