文章編號: 246247 - 上次校閱: 2006年5月11日 - 版次: 4.0

如何接收 WebBrowser 主機的 HTML 文件事件

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

開發人員經常裝載 WebBrowser 控制項在 Microsoft Visual C++] 或 [Visual Basic 中的想要接收目前載入的文件的事件。這是非常方便,對於提供全域瀏覽器作者想要實作跨使用者經驗的這類的抓取上按下的連結或一段選取文字的外部資訊內的所有網頁的行為。

Visual C++ 和 Visual Basic 的一般的策略是:
  1. 接收 WebBrowser 控制項的事件 (DWebBrowserEvents2 介面),並擷取 DocumentComplete 事件。因為文件不保證是完全載入,直到這個事件引發時,所有文件接收必須完成從這裡。
  2. 在 DocumentComplete,擷取 WebBrowser 的文件物件,並擊沉 HtmlDocumentEvents 介面。在 Visual Basic 執行此操作的物件型別的 HTMLDocument 物件上使用 WithEvents 關鍵字。
  3. 處理該事件,並傳回布林值,指出您是否想 Internet Explorer 來執行它自己的事件處理或取消該事件。
  4. 清除在 BeforeNavigate2 和 OnDestroy 接收器,因為您殺死應用程式時,將不會被清除最後一個接收。

其他相關資訊

Visual C++ (ATL)

第一個順序的業務,Visual C++ 中是以建立您的事件接收器。必須建立兩個事件接收器: 一如 DWebBrowserEvents2 WebBrowser] 控制項,一個用於 HtmlDocumentEvents (MSHTML.H 中定義) 為實際的使用中範本程式庫 (ATL) 文件。

DWebBrowserEvents2 接收器可以實作非常迅速地使用 ATL 的 IDispEventImpl 下列 「 Microsoft 知識庫 」 文件中所述:
194179? (http://support.microsoft.com/kb/194179/ ) AtlEvnt.exe 範例會示範如何使用 ATL IDispEventImpl 和 IDispEventSimpleImpl 類別建立 ATL 接收
因為每次使用者巡覽至新頁面會是一份新文件,您必須接收文件事件每當 WebBrowser 控制項就會擲回 DocumentComplete 事件。您 DocumentComplete 處理常式內使用下列程式碼來接收文件事件:
// 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;
}
				
可在下列 「 知識庫 」 文件中找到關於接收 DocumentComplete,特別是當牽涉到框架的其他資訊:
180366? (http://support.microsoft.com/kb/180366/ ) 如何判斷何時完成頁面載入 WebBrowser 控制項中
您的 HTML 文件事件接收器必須包含檔案 <MSHTML.h> 和 <MSHTMDID.h> (其中定義的所有 [DISPID HTMLDocumentEvents 的)。

可取消的文件事件的事件處理常式必須傳回布林值的 IDispatch::Invoke() 方法 pvarResult 參數中。值為 VARIANT_TRUE 表示 Internet Explorer 應該執行自己的事件處理 ; 值為 VARIANT_FALSE 會取消該事件。基於這個原因您應該覆寫 Invoke() 直接代替使用像這將不允許您變更 pvarResult 的 ATL 的 IDispEventImpl 的快顯實作。若要覆寫 Invoke() 成功地在 ATL 事件接收器中的,請參閱下列的 「 Microsoft 知識庫 」 中的文件:
181277? (http://support.microsoft.com/kb/181277/ ) AtlSink.exe 範例會示範如何利用 Visual C++ 中的使用中的樣板程式庫 (ATL) 執行分配介面接收器
下列的接收器程式碼將示範如何 Invoke() 可加以覆寫,以處理 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;
}
				
Finally,請確定取消通知您接收器中 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

在 Visual Basic 過程都是一樣的: 接收器 DocumentComplete 事件 WebBrowser 物件中的文件事件。幸運的是,接收的事件程序會縮短利用 Visual Basic WithEvents 關鍵字中使用變數宣告的合作。

假設您 WebBrowser 為 WebBrowser1],Microsoft HTML 物件程式庫加入專案,下列程式碼行為與 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
				

?考

如需有關 Microsoft Internet Explorer 開發 Web 為基礎的解決方案的詳細資訊,請造訪下列 Microsoft 網站:
http://msdn.microsoft.com/ie/ (http://msdn.microsoft.com/ie/)

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

這篇文章中的資訊適用於:
  • 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
關鍵字:?
kbmt kbactivexevents kbhowto kbwebbrowser KB246247 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:246247? (http://support.microsoft.com/kb/246247/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
Retired KB Article依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。