evento BHO Handle OnSubmit
-
07-07-2019 - |
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?
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:
- Você provavelmente quer
dwCookie
cache ecpc
, desde que você precisar deles mais tarde quando você chamarpcp->Unadvise()
para desconectar a pia. - Na chamada para
pcp->Advise()
acima, eu passar este. Você pode usar qualquer objeto que você tem que implementosIDispatch
, que pode ou não ser este objeto. Projeto esquerda para você. -
riid
será o dispinterface evento que deseja afundar. Neste caso, você provavelmente vai quererDIID_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