Как добавить прослушиватель событий с помощью addEventListener MSHTML в IE9?

Документация MSDN для addEventListener говорит, что принимает функцию обратного вызова в форме IDispatch * объект. Из C# (я использую COM-взаимодействие), Visual Studio отображает тип параметра просто object,

Я искал IEventListener интерфейс или что-то подобное, но не нашел. Что я должен пройти?

1 ответ

Решение

После некоторых исследований я узнал, что эти точки подключения 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)],


Несмотря на все это, решения, которые избегают API событий DOM W3C, могут быть более подходящими, поскольку объекты IE9 DOM не поддерживают этот метод, когда браузер использует режим совместимости с более низким режимом документа. Например, расширение, которое использует addEventListener потерпит неудачу на странице типа Bing, которая отображается в режиме IE7.

Также не представляется возможным установить режим документа, используемый IWebBrowser2 Например, вручную делать это с помощью инструментов разработчика F12.

Другие вопросы по тегам