Numéro d'article: 246247 - Dernière mise à jour: jeudi 11 mai 2006 - Version: 4.0

Mode récepteur HTML document événements ordinateur hôte WebBrowser

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.

Sommaire

Agrandir tout | Réduire tout

Résumé

Les développeurs souhaitant ordinateur hôte le contrôle WebBrowser dans Microsoft Visual C++ ou Visual Basic fréquemment récepteur d'événements pour le document actuellement chargé. C'est très pratique pour fournir le comportement global qui navigateur auteurs souhaitez implémenter sur toutes les pages de l'expérience utilisateur, comme les s'externes d'informations sur un lien sur ou une partie du texte sélectionné.

La stratégie générale pour Visual C++ et Visual Basic est :
  1. Récepteur d'événements du contrôle WebBrowser (l'interface DWebBrowserEvents2) et capturer l'événement DocumentComplete. Étant donné que dont le document n'est pas garantie entièrement chargé jusqu'à ce que cet événement se déclenche, tous les documents recevoir doit être effectuée à partir ici.
  2. Dans DocumentComplete, récupérer document objet la WebBrowser et l'interface HtmlDocumentEvents de récepteur. Dans Visual Basic, cela à l'aide du mot-clé WithEvents sur un objet de type HTMLDocument.
  3. Gérer l'événement et renvoient une valeur booléenne si vous voulez qu'Internet Explorer pour effectuer son propre traitement des événements ou annuler l'événement.
  4. Désactivez le récepteur dans BeforeNavigate2 et OnDestroy depuis le dernier récepteur n'est pas être effacée lorsque vous arrêter l'application.

Plus d'informations

Visual C++ (ATL)

L'activité d'of commande premier dans Visual C++ est pour créer votre événement récepteurs. Deux récepteurs d'événements doivent être créés : un pour DWebBrowserEvents2 pour le contrôle WebBrowser et un pour HtmlDocumentEvents (défini dans MSHTML.H) pour le document ATL (Active Template Library) réel.

Le récepteur DWebBrowserEvents2 peut être implémenté à l'aide très rapidement IDispEventImpl D'ATL, comme décrit dans l'article suivant de la base de connaissances Microsoft :
194179  (http://support.microsoft.com/kb/194179/ ) AtlEvnt.exe exemple montre comment crée les récepteurs D'ATL en utilisant les classes ATL IDispEventImpl et IDispEventSimpleImpl
Car il sera un nouveau document chaque fois que l'utilisateur accède à une nouvelle page, vous devez recevoir les événements de document chaque fois que le contrôle WebBrowser génère l'événement DocumentComplete. Dans le Gestionnaire de DocumentComplete, utiliser le code suivant pour récepteur d'événements de documents :
// 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;
}
				
informations supplémentaires sur recevoir DocumentComplete, en particulier lorsque les cadres sont impliquées, se trouvent dans l'article suivant de la base de connaissances :
180366  (http://support.microsoft.com/kb/180366/ ) Comment faire pour déterminer une page faite chargement dans contrôle WebBrowser
Votre récepteur d'événements document HTML doit inclure les fichiers <MSHTML.h> et <MSHTMDID.h> (qui définit toutes les DISPID pour HTMLDocumentEvents).

Gestionnaires d'événements pour document annulables doivent renvoyer une valeur de type Boolean valeur dans le paramètre pvarResult de la méthode IDispatch::Invoke(). Une valeur VARIANT_TRUE indique que Internet Explorer doit exécuter son propre traitement des événements ; une valeur de VARIANT_FALSE annule l'événement. Pour cette raison, vous devez remplacer Invoke() directement au lieu de l'aide d'une implémentation contextuel comme IDispEventImpl D'ATL, qui pas permet de modifier le pvarResult. Pour remplacer Invoke() correctement dans un récepteur d'événements ATL, consultez l'article suivant dans la Base de connaissances :
181277  (http://support.microsoft.com/kb/181277/ ) L'exemple AtlSink.exe montre comment implémenter un récepteur dispinterface à l'aide de ATL (Active Template Library) dans Visual C++
Le code de récepteur suivant illustre comment Invoke() peut être remplacée pour gérer l'événement Click (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;
}
				
Enfin, assurez-vous que vous unadvise votre récepteur de 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

Le processus dans Visual Basic est identique : récepteur d'événements de documents dans l'événement DocumentComplete pour l'objet WebBrowser. Heureusement, le processus de recevoir des événements est réduite en utilisant WithEvents clé Visual Basic dans coopération avec une déclaration de variable.

En supposant que votre WebBrowser nommé WebBrowser1 et que vous ajoutées au projet bibliothèque d'objets Microsoft HTML, le code suivant comporte exactement comme le code C++:
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
				

Références

Pour plus d'informations sur le développement de solutions Web pour Microsoft Internet Explorer, reportez-vous au adresse aux sites Web de Microsoft aux adresses suivantes :
http://msdn.microsoft.com/ie/ (http://msdn.microsoft.com/ie/)

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

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Internet Explorer 4.0 Édition 128 bits
  • 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
Mots-clés : 
kbmt kbactivexevents kbhowto kbwebbrowser KB246247 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 246247  (http://support.microsoft.com/kb/246247/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Retired KB ArticleExclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.