Makale numarası: 246247 - Son Gözden Geçirme: 11 Mayıs 2006 Perşembe - Gözden geçirme: 4.0

WebBrowser ana havuzu HTML belgesi olayları nasıl

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Geliştiriciler, Microsoft Visual C++ veya Visual Basic WebBrowser denetimi sık ana bilgisayar, olayları şu anda yüklü olan belgenin batar istiyorsunuz. Bu, tarayıcı yazarlar tıklattığınız bir bağlantı veya seçili metnin bir parçası olarak dış bilgi grabbing gibi kullanıcı deneyimi, içindeki tüm sayfalar arasında uygulamak istediğiniz genel davranışı sağlamak için çok kullanışlı değildir.

Visual Basic ve Visual C++ için genel anahtar stratejisidir:
  1. WebBrowser denetiminin olayları (DWebBrowserEvents2 arabirimi) batar ve DocumentComplete Olayı yakalayın. Belgeyi bu olayı kadar tam olarak yüklenebilmesi için garantili için tüm belge sinking buradan yapılması gerekir.
  2. DocumentComplete, WebBrowser'ın belge nesnesi almak ve HtmlDocumentEvents arabirimi batar. Visual Basic'te, bir nesne türü HTMLDocument WithEvents anahtar sözcüğünü kullanarak bunu.
  3. Olay işleyecek ve ınternet Explorer'ın kendi olay işlem gerçekleştirmek veya olayı iptal etmek isteyip istemediğinizi belirten bir Boole değeri döndürür.
  4. Uygulama sonlandırma, son havuzu temizlenmesini olmaz çünkü BeforeNavigate2 ve OnDestroy havuz temizleyin.

Daha fazla bilgi

Visual C++ (ATL)

Visual C++ ilk sipariş of işletmede, olay havuzlarını ' dir. Iki olay havuzlarını oluşturulmalıdır: DWebBrowserEvents2 WebBrowser denetimi için bir ve gerçek Active Template Library (ATL) belgenin (MSHTML.H içinde tanımlanmıştır) HtmlDocumentEvents biri.

DWebBrowserEvents2 havuzu çok hızlı bir şekilde ATL'ın IDispEventImpl, kullanarak aşağıdaki Microsoft Bilgi Bankası makalesinde açıklanan uygulanabilir:
194179  (http://support.microsoft.com/kb/194179/ ) ATL IDispEventImpl ve IDispEventSimpleImpl sınıfları kullanarak ATL havuzlarını oluşturur nasıl AtlEvnt.exe örnek gösterir
WebBrowser denetimi DocumentComplete Olayı atan her belge olaylarını, olacağı için yeni bir belge her kullanıcı için yeni bir sayfa giderse batar gerekir. DocumentComplete işleyicisi içinde belge olaylarını batar şu kodu kullanın:
// 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;
}
				
çerçeveleri özellikle söz konusu olduğunda, DocumentComplete sinking hakkında ek bilgi aşağıdaki Bilgi Bankası makalesinde bulunabilir:
180366  (http://support.microsoft.com/kb/180366/ ) Bir sayfa ne zaman yapılacağını belirleme WebBrowser denetimi yükleniyor.
HTML belgesi olay Havuzunuzu <MSHTMDID.h> ve <a1>Dosya</a1> <MSHTML.h> içermelidir (olan tüm DISPIDs HTMLDocumentEvents için tanımlar).

Iptal edilebilen belge olaylarını olay işleyicilerini, IDispatch::Invoke() yöntemi pvarResult parametresinde bir Boole değeri döndürmelidir. Internet Explorer, olay işleme gerçekleştirmelisiniz VARIANT_TRUE değeri gösterir; VARIANT_FALSE değeri olan olayını iptal eder. Bu nedenle, bir kısayol uygulaması gibi pvarResult değiştirmek izin vermiyor ATL'ın IDispEventImpl kullanmak yerine doğrudan Invoke() geçersiz kılmak. ATL olay havuzunda başarıyla bir Invoke() geçersiz kılmak için <a0></a0>, Microsoft Knowledge Base'de aşağıdaki makaleye bakın:
181277  (http://support.microsoft.com/kb/181277/ ) Visual C++ ile Active Template Library (ATL) kullanarak bir görüntüleme arabirimi havuzu nasıl AtlSink.exe örnek gösterir
Aşağıdaki havuzu kod Invoke() Click olayını (DISPID_CLICK) işlemek için nasıl kılınabilir gösterir:
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;
}
				
finally, Havuzunuzu BeforeNavigate2 içinde unadvise emin olun:
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

Visual Basic'te süreç aynıdır: belge DocumentComplete Olayı WebBrowser nesne için olay havuzu. Neyse ki, bir değişken bildiriminde ile'işbirliği Visual Basic'ın WithEvents'anahtar sözcüğünü kullanarak olay sinking işlemi kısaltılır.

Bilgisayarınızı WebBrowser WebBrowser1 olarak adlandırılır ve Microsoft HTML Nesne Kitaplığı projeye eklediğiniz varsayarak, aşağıdaki kodu aynı C++ kod davranır:
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
				

Referanslar

Microsoft ınternet Explorer için Web tabanlı çözümler geliştirme hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitelerini ziyaret edin:
http://msdn.microsoft.com/ie/ (http://msdn.microsoft.com/ie/)

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

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 4.01 Service Pack 1
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer 5.5
Anahtar Kelimeler: 
kbmt kbactivexevents kbhowto kbwebbrowser KB246247 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:246247  (http://support.microsoft.com/kb/246247/en-us/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.