Событие мыши BHO

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

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

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


person shaimagz    schedule 09.03.2010    source источник


Ответы (1)


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)) 
    {
        // ...
    }
}
person Georg Fritzsche    schedule 09.03.2010
comment
это не позволяет мне добавить MainClassName::Invoke как функцию: переопределение виртуальной функции отличается от 'ATL::IDispatchImpl‹T,piid,plibid,wMajor,wMinor›::Invoke' только соглашением о вызовах - person shaimagz; 09.03.2010
comment
Используйте HRESULT STDMETHODCALLTYPE Invoke(/* params */) или STDMETHOD(Invoke)(/* params */) для объявления. - person Georg Fritzsche; 09.03.2010
comment
Спасибо! последний вопрос: как в методе вызова использовать текущий IDispatch? - person shaimagz; 09.03.2010
comment
Думаю, я понимаю, но единственная причина, по которой мне нужно событие мыши, - это получать изменения на странице, когда кто-то на что-то нажимает. и мне нужно получить объект IHTMLDocument2. - person shaimagz; 09.03.2010
comment
Я вижу, я как-то увидел там другой вопрос. Но вы всегда можете зарегистрировать пользовательские объекты прослушивателя событий, которые имеют доступ к нужному вам документу? - person Georg Fritzsche; 09.03.2010