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?

Était-ce utile?

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:

  1. Vous voulez probablement mettre en cache dwCookie et cpc , car vous en aurez besoin ultérieurement lorsque vous appelez pcp- > Unadvise () pour vous déconnecter l'évier.
  2. Dans l'appel à pcp- > Advise () ci-dessus, je passe ceci. Vous pouvez utiliser n'importe quel objet implémentant IDispatch , qui peut être ou non cet objet. Le design vous est laissé.
  3. riid sera l'évènement dispinterface que vous souhaitez recevoir. Dans ce cas, vous souhaiterez probablement DIID_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"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top