Обработка события OnClick флажка

Я пытаюсь обработать события щелчка элемента управления флажок из BHO.

Вот мой код:

void STDMETHODCALLTYPE CMyBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
// ...

InitPage(pDocument);
}

void CMyBHO::InitPage(IHTMLDocument2 *pDocument)
{
CComQIPtr<IHTMLDocument3> document3 = pDocument;

CComPtr<IHTMLElement> elementCheckbox;
document3->getElementById(CComBSTR(L"checkbox_id_here"), &elementCheckbox);
if(!elementCheckbox)
return;

if(!m_fCheckboxAdvised)
{
// Register to sink events from HTMLDocumentEvents2.
hr = IHTMLElementEvents2Impl::DispEventAdvise(elementCheckbox);
if(SUCCEEDED(hr))
m_fCheckboxAdvised = TRUE;
else
ATLASSERT(0); // FAILS HERE, hr = 0x80040200
}
}

Заголовочный файл:

class ATL_NO_VTABLE CMyBHO :
/*...*/
public IDispEventImpl<1, CMyBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>,
public IDispEventImpl<2, CMyBHO, &DIID_HTMLElementEvents2, &LIBID_MSHTML, 4, 0>
{
typedef IDispEventImpl<1, CMyBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1> IDWebBrowserEvents2Impl;
typedef IDispEventImpl<2, CMyBHO, &DIID_HTMLElementEvents2, &LIBID_MSHTML, 4, 0> IHTMLElementEvents2Impl;

public:

/*...*/

BEGIN_SINK_MAP(CMyBHO)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
SINK_ENTRY_EX(2, DIID_HTMLElementEvents2, DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnMouseClick)
END_SINK_MAP()

public:
STDMETHOD(SetSite)(IUnknown *pUnkSite);

// DWebBrowserEvents2
void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);

// HTMLDocumentEvents2
void STDMETHODCALLTYPE OnMouseClick(IHTMLEventObj *eventObj);

/*...*/
};

DispEventAdvise терпит неудачу с часом = 0x80040200, Что я делаю неправильно?

Кроме того, когда я должен позвонить DispEventUnadvise?

2

Решение

У вас нет точки подключения, которую вы запрашиваете, следовательно, CONNECT_E_NOCONNECTION отказ.

Вместо реализации клиента точки подключения для элементов HTML с множеством интерфейсов, вы можете предпочесть альтернативный маршрут и реализовать IDispatch для вашего объекта приемника событий, а затем назначить указатель интерфейса на onclick свойство элемента HTML. Ты получишь IDispatch::Invoke позвонить на мероприятии.

Вот фрагмент кода для создания экземпляра подходящего IDispatch реализация и настройка onresize свойство с помощью кода C ++:

CComPtr<IHTMLElement> pBodyElementA;
ATLENSURE_SUCCEEDED(pDocument->get_body(&pBodyElementA));
CComPtr<IDispatch> pSinkDispatch;
ATLENSURE_SUCCEEDED(CDispatchEventSink::CreateInstance(&pSinkDispatch));
CComVariant vValue = pSinkDispatch;
ATLENSURE_SUCCEEDED(reinterpret_cast<CComPtr<IDispatch>&>(pBodyElementA).
PutPropertyByName(L"onresize", &vValue));

CDispatchEventSink класс Вот, и там вы найдете полный образец проекта (также, SVN ссылка на сайт).

введите описание изображения здесь

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]