Événement BHO Handle OnSubmit
-
07-07-2019 - |
Question
En gros, je souhaite développer un BHO qui valide certains champs d'un formulaire et place automatiquement les e-mails jetables dans les champs appropriés (davantage à ma connaissance). Donc, dans l'événement DOCUMENTCOMPLETE, j'ai ceci:
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...
}
Comment utiliser l'interface IHTMLFormElement pour écouter l'événement onsubmit?
La solution
Une fois que vous avez le pointeur sur l'élément pour lequel vous souhaitez collecter des événements, vous devez QueryInterface ()
pour IConnectionPointContainer
, puis vous connecter à celui-ci:
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);
}
}
Quelques notes:
- Vous voulez probablement mettre en cache
dwCookie
etcpc
, car vous en aurez besoin ultérieurement lorsque vous appelezpcp- > Unadvise ()
pour vous déconnecter l'évier. - Dans l'appel à
pcp- > Advise ()
ci-dessus, je passe ceci. Vous pouvez utiliser n'importe quel objet implémentantIDispatch
, qui peut être ou non cet objet. Le design vous est laissé. -
riid
sera l'évènement dispinterface que vous souhaitez recevoir. Dans ce cas, vous souhaiterez probablementDIID_HTMLFormElementEvents2
.
Voici comment vous déconnecter:
pcp->Unadvise(dwCookie);
Faites-moi savoir si vous avez d'autres questions.
Édition-1:
Oui, cette IDID était fausse. Ce doit être: DIID_HTMLFormElementEvents2
.
Voici comment je l'ai trouvé:
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"