Evento OnSubmit handle BHO
-
07-07-2019 - |
Domanda
Fondamentalmente voglio sviluppare un BHO che convalida determinati campi in un modulo e posiziona automaticamente le e-mail usa e getta nei campi appropriati (più per mia conoscenza). Quindi nell'evento DOCUMENTCOMPLETE ho questo:
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...
}
Come utilizzare l'interfaccia IHTMLFormElement per ascoltare l'evento onsubmit?
Soluzione
Una volta che hai il puntatore sull'elemento per cui vuoi affondare gli eventi, lo QueryInterface ()
per IConnectionPointContainer
e quindi ti connetti a questo:
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);
}
}
Alcune note:
- Probabilmente vuoi mettere in cache
dwCookie
ecpc
, dato che ti servono in seguito quando chiamipcp- > Unadvise ()
per disconnetterti il lavandino. - Nella chiamata a
pcp- > Advise ()
sopra, passo questo. Puoi usare qualsiasi oggetto tu abbia implementatoIDispatch
, che può essere o meno questo oggetto. Design lasciato a te. -
riid
sarà l'interfaccia di evento che vuoi affondare. In questo caso, probabilmente vuoiDIID_HTMLFormElementEvents2
.
Ecco come disconnettersi:
pcp->Unadvise(dwCookie);
Fammi sapere se hai ulteriori domande.
Modifica-1:
Sì, quel DIID era sbagliato. Dovrebbe essere: DIID_HTMLFormElementEvents2
.
Ecco come l'ho trovato:
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow