2

基本的に、フォームの特定のフィールドを検証し、使い捨ての電子メールを適切なフィールドに自動配置する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イベントをリッスンするにはどうすればよいですか?

4

1 に答える 1

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. 後でシンクを切断するために呼び出すときに必要になるため、おそらく と をキャッシュdwCookieする必要があります。cpcpcp->Unadvise()
  2. 上記の呼び出しではpcp->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"
于 2009-09-13T18:42:04.293 に答える