حدث التعامل مع BHO عند الإرسال
-
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؟
المحلول
بمجرد حصولك على المؤشر إلى العنصر الذي تريد إدخال الأحداث إليه، يمكنك القيام بذلك 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);
}
}
بعض الملاحظات:
- ربما تريد التخزين المؤقت
dwCookie
وcpc
, ، لأنك تحتاج إليها لاحقًا عند الاتصالpcp->Unadvise()
لفصل الحوض. - في الدعوة إلى
pcp->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