質問

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

役に立ちましたか?

解決

イベントをシンクする要素へのポインターを取得したら、 IConnectionPointContainer QueryInterface()に接続し、それに接続します:

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. 後で pcp-&gt; Unadvise()を呼び出して切断するときに必要になるため、 dwCookie cpc をキャッシュする必要があります。シンク。
  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"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top