BHOハンドルOnSubmitイベント
-
07-07-2019 - |
質問
基本的には、フォーム上の特定のフィールドを検証し、適切なフィールドに使い捨ての電子メールを自動配置する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);
}
}
注意事項:
- 後で
pcp-&gt; Unadvise()
を呼び出して切断するときに必要になるため、dwCookie
とcpc
をキャッシュする必要があります。シンク。 - 上記の
pcp-&gt; Advise()
の呼び出しで、これを渡します。IDispatch
を実装する任意のオブジェクトを使用できます。このオブジェクトは、このオブジェクトである場合とそうでない場合があります。あなたに残されたデザイン。 -
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"
所属していません StackOverflow