Событие мыши BHO
-
18-09-2019 - |
Вопрос
Я хочу, чтобы мой 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))
{
// ...
}
}