سؤال

أرغب بشكل أساسي في تطوير 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);
    }
}

بعض الملاحظات:

  1. ربما تريد التخزين المؤقت dwCookie و cpc, ، لأنك تحتاج إليها لاحقًا عند الاتصال pcp->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"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top