Evento BHO Handle OnSubmit
-
07-07-2019 - |
Pregunta
Básicamente quiero desarrollar un BHO que valide ciertos campos en un formulario y coloque automáticamente correos electrónicos desechables en los campos apropiados (más para mi propio conocimiento). Entonces, en el evento DOCUMENTCOMPLETE, tengo esto:
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...
}
¿Cómo usaría la interfaz IHTMLFormElement para escuchar el evento onsubmit?
Solución
Una vez que tenga el puntero al elemento para el que desea hundir los eventos, debe QueryInterface ()
para IConnectionPointContainer
y luego conectarse a eso:
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);
}
}
Algunas notas:
- Probablemente desee almacenar en caché
dwCookie
ycpc
, ya que los necesitará más tarde cuando llame apcp- > Unadvise ()
para desconectarse el fregadero. - En la llamada a
pcp- > Advise ()
anterior, paso esto. Puede usar cualquier objeto que tenga que implementeIDispatch
, que puede ser o no este objeto. Diseño que te queda. -
riid
será el evento dispinterface que desea hundir. En este caso, probablemente deseeDIID_HTMLFormElementEvents2
.
Aquí se explica cómo desconectarse:
pcp->Unadvise(dwCookie);
Avíseme si tiene más preguntas.
Editar-1:
Sí, ese DIID estaba equivocado. Debería ser: DIID_HTMLFormElementEvents2
.
Así es como lo encontré:
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow