Вопрос

Я хочу, чтобы мой BHO прослушивал событие onmousedown какого-либо элемента на определенной веб-странице.У меня есть весь код, который находит конкретный элемент, и в msdn its сказано, что мне нужно использовать get_onmousedown получить_onmousedown событие.Я придумал этот код.

 CComQIPtr<IHTMLElement> someElement;
 VARIANT mouse_eve;
 someElement->get_onmousedown(&mouse_eve);

Вопрос в том, как мне сказать ему, чтобы он запускал какую-то функцию при возникновении этого события?

Это было полезно?

Решение

v - ВАРИАНТ типа VT_DISPATCH, который определяет интерфейс IDispatch объекта с методом по умолчанию, который вызывается при возникновении события.

Обработчики событий в этом контексте являются экземплярами COM , которые реализуют IDispatch - итак, вам нужно передать указатель на IDispatch который реализует ваш объект обработчика событий:

CComQIPtr<IDispatch> spDisp(spMyHandler); // something like that
someElement->put_onmousedown(CComVariant(spDisp));

Примечание: put_ вместо того , чтобы get_ - вы хотите зарегистрировать обработчика.

На этом, IDispatch::Invoke() получает вызов с:

  • wFlags содержащий DISPATCH_METHOD ("вызывается метод")
  • dispIdMember будучи 0 / DISPID_VALUE ("метод по умолчанию")

Вместе взятое это должно стать чем-то вроде:

HRESULT MyHandler::Invoke(DISPID dispIdMember, REFIID, LCID, WORD wFlags, 
                          DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*)
{
    // ...

    if((wFlags & DISPATCH_METHOD) && (dispIdMember == DISPID_VALUE)) 
    {
        // ...
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top