Pergunta

Basicamente eu quero desenvolver um BHO que valida determinados campos em um formulário e auto-lugares descartáveis ??e-mails nos campos apropriados (mais de meu próprio conhecimento). Assim, no evento DocumentComplete eu tenho este:

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...         
}

Como eu poderia usar a interface IHTMLFormElement para ouvir o evento onsubmit?

Foi útil?

Solução

Assim que tiver o ponteiro para o elemento que deseja eventos pia para, você QueryInterface()-lo para IConnectionPointContainer e conecte-se que:

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);
    }
}

Algumas notas:

  1. Você provavelmente quer dwCookie cache e cpc, desde que você precisar deles mais tarde quando você chamar pcp->Unadvise() para desconectar a pia.
  2. Na chamada para pcp->Advise() acima, eu passar este. Você pode usar qualquer objeto que você tem que implementos IDispatch, que pode ou não ser este objeto. Projeto esquerda para você.
  3. riid será o dispinterface evento que deseja afundar. Neste caso, você provavelmente vai querer DIID_HTMLFormElementEvents2.

Veja como desconexão:

pcp->Unadvise(dwCookie);

Deixe-me saber se você tem mais perguntas.

Edit-1:

Sim, isso diid estava errado. Ele deve ser:. DIID_HTMLFormElementEvents2

Aqui está como eu achei:

C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top