BHO обрабатывает событие OnSubmit
-
07-07-2019 - |
Вопрос
По сути, я хочу разработать BHO, который проверяет определенные поля в форме и автоматически размещает одноразовые электронные письма в соответствующих полях (больше, насколько мне известно).Итак, в событии DOCUMENTCOMPLETE у меня есть следующее:
for(long i = 0; i < *len; i++)
{
VARIANT* name = new VARIANT();
name->vt = VT_I4;
name->intVal = i;
VARIANT* id = new VARIANT();
id->vt = VT_I4;
id->intVal = 0;
IDispatch* disp = 0;
IHTMLFormElement* form = 0;
HRESULT r = forms->item(*name,*id,&disp);
if(S_OK != r)
{
MessageBox(0,L"Failed to get form dispatch",L"",0);// debug only
continue;
}
disp->QueryInterface(IID_IHTMLFormElement2,(void**)&form);
if(form == 0)
{
MessageBox(0,L"Failed to get form element from dispatch",L"",0);// debug only
continue;
}
// Code to listen for onsubmit events here...
}
Как мне использовать интерфейс IHTMLFormElement для прослушивания события onsubmit?
Решение
Если у вас есть указатель на элемент, для которого вы хотите записать события, вы должны QueryInterface()
это для IConnectionPointContainer
а затем подключитесь к этому:
REFIID riid = DIID_HTMLFormElementEvents2;
CComPtr<IConnectionPointContainer> spcpc;
HRESULT hr = form->QueryInterface(IID_IConnectionPointContainer, (void**)&spcpc);
if (SUCCEEDED(hr))
{
CComPtr<IConnectionPoint> spcp;
hr = spcpc->FindConnectionPoint(riid, &spcp);
if (SUCCEEDED(hr))
{
DWORD dwCookie;
hr = pcp->Advise((IDispatch *)this, &dwCookie);
}
}
Некоторые примечания:
- Вероятно, вы хотите кэшировать
dwCookie
иcpc
, так как они понадобятся вам позже, когда вы позвонитеpcp->Unadvise()
отключить раковину. - В звонке к
pcp->Advise()
выше, я пропускаю это.Вы можете использовать любой имеющийся у вас объект, реализующийIDispatch
, который может быть или не быть этим объектом.Дизайн остается за вами. riid
будет интерфейсом событий, который вы хотите использовать.В этом случае вы, вероятно, захотитеDIID_HTMLFormElementEvents2
.
Вот как отключиться:
pcp->Unadvise(dwCookie);
Дайте мне знать, если у вас есть дополнительные вопросы.
Редактировать-1:
Да, этот DIID был неправильным.Должен быть: DIID_HTMLFormElementEvents2
.
Вот как я это нашел:
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"
Не связан с StackOverflow