1、在http://topic.csdn.net/u/20080223/17/01f87ee8-662e-4e09-ae9e-e3ce081c3c0c.html这个帖子中有两种方式在BHO中注册IE中的表单事件(input的onclick事件和onsubmit事件)请问如何用AtlAdvise的方式注册表单事件?
2、在invoke中又是如何区分并识别所产生事件的元素的名称及内容的?
分值不够再另外开贴。。

解决方案 »

  1.   

    DELPHI能用ATL吗?用ATL向导生成一个COM组件,实现DHTMLFormElementEvents2连接点接口,添加ConnectToForm/DisconnectFromForm方法和一个成员变量DWORD m_dwCookie,
    class ATL_NO_VTABLE CMySink : public CComObjectRootEx<CComSingleThreadModel>,
        public CComCoClass<CMySink, CLSID_NULL>,
        public IDispEventImpl<1, CMySink, &DIID_HTMLFormElementEvents, &LIBID_HTMLDocument>
    {
    public:
      DWORD m_dwCookie;
      ......  HRESULT CMySink::ConnectToForm(IHTMLFormElement* pForm)
      {
        return AtlAdvise(pForm, (IUnknown*)(CComObject<CMySink>*)this, DIID_HTMLFormElementEvents, &m_dwCookie);
      }
      ...
    };
    如何注册:
    IHTMLFormElement* pForm = ...;
    CComObject<CMySink>* pSink = NULL;
    pSink->CreateInstance(&pSink);
    pSink->ConnectToForm(pForm);
      

  2.   

    jameshooo:您好啊,我想用delphi去实现。不知道如何做。在delphi BHO中注册IWebBrowser2事件是这样注册的:
    FIESite := pUnkSite;
    if not Supports(FIESite, IWebBrowser2, FIE) then
    Exit;
    if not Supports(FIE, IConnectionPointContainer, FCPC) then
    Exit;

     // 挂接事件
    FCPC.FindConnectionPoint(DWebBrowserEvents2, FCP);
    FCP.Advise(Self, FCookie);
    那我表单的事件该如何注册啊?是不是应该放在documentcomplete事件中进行注册啊?请您指点。
      

  3.   

    对,是应该放到documentcomplete里面注册,但要注意documentcomplete会调用多次,找到根浏览器(第一个参数)的那次。
      

  4.   

    documentcomplete事件会触发多次,我现在能确定主frame的那个事件的触发,但是就是不知道delphi中如何注册表单的事件?还请jameshooo指点。您有联系方式吗?我可以直接与您交谈吗?其实大体的解决思路我都清楚,但是就是不知道如何具体去做还望您指点。
      

  5.   

    我的联系方式:QQ:155390761 MSN:[email protected]