【问题标题】:BHO Handle OnSubmit eventBHO 处理 OnSubmit 事件
【发布时间】:2010-11-27 22:57:15
【问题描述】:

基本上,我想开发一个 BHO,它可以验证表单上的某些字段并将一次性电子邮件自动放置在适当的字段中(据我所知更多)。所以在 DOCUMENTCOMPLETE 事件中我有这个:

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

如何使用 IHTMLFormElement 接口来监听 onsubmit 事件?

【问题讨论】:

  • 您的代码有很多地方我会更改。第一:不要创建新的VARIANTS,只需在堆栈上声明它们并正常传递它们。无论哪种方式,请确保在完成它们后调用它们的 VariantClear() 以便它们被正确释放。另外,请考虑使用 SUCCEEDED(hr) 而不是 S_OK != r...

标签: c++ internet-explorer events bho


【解决方案1】:

一旦您有了指向要接收事件的元素的指针,您就可以将QueryInterface() 指向IConnectionPointContainer,然后连接到该元素:

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

一些注意事项:

  1. 您可能想要缓存 dwCookiecpc,因为稍后当您调用 pcp-&gt;Unadvise() 断开接收器时需要它们。
  2. 在上面对pcp-&gt;Advise() 的调用中,我通过了这个。您可以使用您拥有的任何实现IDispatch 的对象,它可能是也可能不是这个对象。设计留给您。
  3. riid 将是您想要接收的事件调度接口。在这种情况下,您可能需要DIID_HTMLFormElementEvents2

断开连接的方法如下:

pcp->Unadvise(dwCookie);

如果您还有其他问题,请告诉我。

编辑-1:

是的,那个 DIID 是错误的。应该是:DIID_HTMLFormElementEvents2

我是这样找到它的:

C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"

【讨论】:

  • 非常感谢!我遇到的唯一问题是“DIID_HTMLFormEvents2”没有在任何地方声明。我尝试搜索谷歌,但它没有带来任何东西。任何想法如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2011-01-25
  • 2015-07-02
  • 2015-02-13
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多