ID Artikel: 246247 - Kajian Terakhir: 20 September 2011 - Revisi: 2.0

Bagaimana peristiwa dokumen HTML wastafel untuk browser web host

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Pengembang yang menjadi tuan rumah kontrol browser web di Microsoft Visual C++ atau Visual Basic sering ingin tenggelam peristiwa untuk dokumen saat ini dimuat. Hal ini sangat berguna untuk menyediakan global perilaku yang browser penulis ingin menerapkan di semua halaman dalam pengalaman pengguna, seperti meraih eksternal informasi pada link diklik atau teks yang dipilih.

Strategi umum untuk Visual C++ dan Visual Basic adalah:
  1. Tenggelam kontrol browser web peristiwa (antarmuka DWebBrowserEvents2) dan menangkap acara DocumentComplete. Karena dokumen tidak dijamin akan terisi penuh sampai ini peristiwa kebakaran, semua dokumen tenggelam harus dilakukan dari sini.
  2. Dalam DocumentComplete, mengambil WebBrowser dokumen objek dan tenggelam antarmuka HtmlDocumentEvents. Dalam Visual Basic, melakukannya dengan menggunakan kata kunci WithEvents pada objek dari tipe HTMLDocument.
  3. Menangani acara, dan kembali nilai Boolean yang mengindikasikan Apakah Anda ingin Internet Explorer untuk melakukan pemrosesan acara sendiri atau membatalkan acara.
  4. Jelas tenggelam di BeforeNavigate2 dan OnDestroy karena wastafel terakhir tidak akan dihapus ketika Anda membunuh aplikasi.

INFORMASI LEBIH LANJUT

Visual C++ (ATL)

Agar usaha pertama di Visual C++ adalah untuk membuat acara Anda tenggelam. Dua acara tenggelam harus dibuat: satu untuk DWebBrowserEvents2 untuk kontrol browser web, dan satu untuk HtmlDocumentEvents (didefinisikan dalam MSHTML.H) untuk dokumen perpustakaan Template aktif (ATL) yang sebenarnya.

Wastafel DWebBrowserEvents2 dapat diimplementasikan sangat cepat menggunakan ATL's IDispEventImpl, seperti yang dijelaskan dalam artikel Basis Pengetahuan Microsoft berikut:
194179  (http://support.microsoft.com/kb/194179/ ) AtlEvnt.exe sampel menunjukkan bagaimana untuk menciptakan ATL tenggelam dengan menggunakan kelas ATL IDispEventImpl dan IDispEventSimpleImpl
Karena akan ada dokumen baru setiap kali pengguna menavigasi ke halaman baru, Anda harus tenggelam dokumen peristiwa setiap kali browser web kontrol melempar DocumentComplete acara. Dalam DocumentComplete handler, gunakan kode berikut untuk tenggelam dokumen peristiwa:
// Declare these as members of your IWebBrowser2 sink.
CComObject<CDocumentSink> *pSink;
CComPtr<IUnknown> pSrcUnk;
DWORD dwDocCookie;

STDMETHODIMP CWebOCWindow::DocumentComplete(IDispatch *wbDisp, VARIANT* url) {
	HRESULT hr;
	CComPtr<IDispatch> pDocDisp;
	CComQIPtr<IHTMLDocument2> pDoc;
	CComPtr<IUnknown> wbDispUnk;

	// Sink only the topmost document. Slightly more complex logic will be needed
	// if you wish to sink multiple pages embedded in a frameset.
	hr = wbDisp->QueryInterface(IID_IUnknown, reinterpret_cast<void **>(&wbDispUnk));
	if (FAILED(hr)) {
		goto cleanup;
	}
	if (wbDispUnk == browserUnk) {
		hr = CComObject<CDocumentSink>::CreateInstance(&pSink);
		if (FAILED(hr)) {
			goto cleanup;
		}
		// Get the current document from the WebBrowser.
		// If you'll be surfing to sites with frames, and want to avoid sinking all but
		// the top-level document - i.e., the frameset - make sure to sink only when the
		// IUnknown obtained from wbDisp and the original IUnknown of the hosted 
		// WebBrowser control are equal.
		hr = webOC->get_Document(&pDocDisp);
		if (FAILED(hr)) {
			goto cleanup;
		}
		hr = pDocDisp->QueryInterface(&pSrcUnk);
		if (FAILED(hr)) {
			goto cleanup;
		}
		// If this is not an HTML document (e.g., it's a Word doc or a PDF), don't sink. 
		pDoc = pDocDisp;
		if (!pDoc) {
			goto cleanup;
		}

		hr = AtlAdvise(pSrcUnk, pSink, DIID_HTMLDocumentEvents, &dwDocCookie);
		if (FAILED(hr)) {
			goto cleanup;
		}
	}

cleanup:
	// Only smart pointers used - nothing to do here.
	return hr;
}
				
Informasi tambahan tentang DocumentComplete tenggelam, terutama ketika frame yang terlibat, dapat ditemukan di artikel Basis Pengetahuan berikut:
180366  (http://support.microsoft.com/kb/180366/ ) Cara menentukan ketika suatu halaman selesai memuat dalam browser web kontrol
Sink acara dokumen HTML Anda harus menyertakan file <mshtml.h>dan <mshtmdid.h>(yang mendefinisikan semua DISPIDs untuk HTMLDocumentEvents).</mshtmdid.h> </mshtml.h>

Event handler untuk cancelable dokumen acara harus mengembalikan nilai Boolean di parameter pvarResult metode IDispatch::Invoke(). Nilai VARIANT_TRUE menunjukkan bahwa Internet Explorer harus melakukan pemrosesan acara sendiri; nilai VARIANT_FALSE membatalkan acara. Untuk alasan ini, Anda harus mengganti Invoke() langsung alih-alih menggunakan cara pintas pelaksanaan seperti ATL's IDispEventImpl, yang akan memungkinkan Anda untuk mengubah pvarResult. Untuk mengganti Invoke() berhasil di ATL acara wastafel, lihat artikel berikut pada Basis Pengetahuan Microsoft:
181277  (http://support.microsoft.com/kb/181277/ ) AtlSink.exe sampel menunjukkan bagaimana menerapkan wastafel dispinterface dengan menggunakan perpustakaan Template aktif (ATL) in Visual C++
Kode wastafel berikut menunjukkan bagaimana Invoke() dapat diganti untuk menangani Click event (DISPID_CLICK):
void OnClick(VARIANT_BOOL *bProcessEvent) {
        AtlTrace("CDocumentSink:OnClick - Obtained a click on the document\n");
	*bProcessEvent = TRUE;
}

STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT *pvarResult,
			  EXCEPINFO *pexcepinfo, UINT *puArgErr) {
        HRESULT hr;

	if (dispidMember == DISPID_CLICK) {
	    VARIANT_BOOL bEventRet;
	    OnClick(&bEventRet);
	    pvarResult->vt = VT_BOOL;
	    pvarResult->boolVal = bEventRet;
            hr = S_OK;
	} else {
            hr = DISP_E_MEMBERNOTFOUND;
	}
	return hr;
}
				
Akhirnya, pastikan Anda unadvise Anda tenggelam dalam BeforeNavigate2:
STDMETHODIMP CWebOCWindow::BeforeNavigate2(IDispatch *pDisp, VARIANT *url, VARIANT *Flags, VARIANT *TargetFrameName,
							 VARIANT *PostData, VARIANT *Headers, VARIANT_BOOL *Cancel) {
	if (pSrcUnk) {
		hr = AtlUnadvise(pSrcUnk, DIID_HTMLDocumentEvents, dwDocCookie);
		pSrcUnk.Detach();
	}
	return S_OK;
}
				

Visual Basic

Proses dalam Visual Basic adalah sama: tenggelam dokumen peristiwa di acara DocumentComplete untuk objek browser web. Untungnya, proses dari peristiwa tenggelam disingkat dengan menggunakan kata kunci WithEvents Visual Basic bekerjasama dengan Deklarasi variabel.

Dengan asumsi Anda WebBrowser bernama WebBrowser1 dan Anda menambahkan perpustakaan objek Microsoft HTML untuk proyek, kode berikut berperilaku persis sama C++ kode:
Dim WithEvents doc As HTMLDocument

Private Sub Form_Load()
    WebBrowser1.Navigate "http://www.microsoft.com/"
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    Dim htm As IHTMLDocument2
    
    On Error Resume Next
    Set htm = WebBrowser1.Document
    If Err.Number = 0 Then
        MsgBox "HREF is " & htm.location.href
    End If
    
    Set doc = htm
End Sub

Private Function doc_onclick() As Boolean
    MsgBox "Clicked the document!"
    ' Tell IE to continue processing the event.
    doc_onclick = True
End Function

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, _
						    TargetFrameName As Variant, PostData As Variant, Headers As Variant, _
						    Cancel As Boolean)
    set doc = Nothing
End Sub
				

REFERENSI

Untuk informasi lebih lanjut tentang mengembangkan solusi berbasis Web untuk Microsoft Internet Explorer, kunjungi Website Microsoft berikut:
http://MSDN.Microsoft.com/IE/ (http://msdn.microsoft.com/ie/)

http://support.microsoft.com/iep (http://support.microsoft.com/iep)

Berlaku bagi:
  • Microsoft Internet Explorer 4.01 Service Pack 1
Kata kunci: 
kbactivexevents kbhowto kbwebbrowser kbmt KB246247 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:246247  (http://support.microsoft.com/kb/246247/en-us/ )
Retired KB ArticleSanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.