private void button1_Click(object sender, EventArgs e)
{
wb.Url = new Uri("http://www.baidu.com");
wb.DocumentCompleted+=new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
//這是給wb添載入入完畢的事件
}
private void wb_DocumentCompleted(object sender, EventArgs e)//這個就是當網頁載入完畢後要進行的操作
{
richTextBox1.Text = wb.DocumentText;//輸出載入網頁的HTML代碼到文字框
}
一般情況下,當ReadyState屬性變成READYSTATE_COMPLETE時,Webbrowser控制項會通過觸發DocumentCompleted事件來指示網頁載入完畢。但當載入的網頁包含frame時,可能會多次觸發該事件,所以不能簡單地通過它來判斷網頁載入完畢。
從微軟的官方網站上瞭解到,並非每個frame都對應了一個DocumentCompleted事件,只有觸發了DownloadBegin事件的frame才會有相應的DocumentCompleted事件。另外,最外層的frame總是最後觸發DocumentCompleted事件。DocumentCompleted事件具有一個IDispatch *類型的參數,它指示了是在哪個frame上觸發的該事件。所以,要判斷文檔是否載入完畢,只需要判斷IDispatch *參數是否是Webbrowser控制項的IDispatch.
-----------------------下文摘自msdn----------------------------------
WebBrowser 控制項觸發 DocumentComplete 事件的 ReadyState 屬性更改為 READYSTATE_COMPLETE 時。 這表示 WebBrowser 控制項已完成下載網頁。 以下是有關此事件的一些要點:
在帶有沒有架構頁的情況下 DocumentComplete 觸發一次所有完成後。
在多個的幀的情況下 DocumentComplete 擷取觸發多次。 並非每個架構將觸發此事件,但觸發 DownloadBegin 事件的每個架構將觸發相應的 DocumentComplete 事件。
DocumentComplete 事件有一個 IDispatch * 為參數是用於觸發 DocumentComplete 架構 (Shdocvw) 的 IDispatch。
頂級架構觸發最後 DocumentComplete。 以檢查是否不進行頁面下載,需要檢查 IDispatch * 參數是否與 WebBrowser 控制項的 IDispatch 相同。
對於 Visual Basic 以下是執行此檢查的代碼: Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object,
URL As Variant)
If (pDisp Is WebBrowser1.Object) Then
Debug.Print "Web document is finished downloading"
End If
End Sub
要處理 DocumentComplete 事件在 Visual C++ 中的,並確定網頁的下載是否完成,請執行這些步驟。
請注意您執行的步驟取決於使用 WebBrowser 控制項的方式。
如果要建立 WebBrowser 控制項 CWnd / CView 對象中,您必須執行步驟 1 至 4。
如果您 CDialog / CFormView 對象中建立 WebBrowser 控制項,只需要執行步驟 4。
如果您使用隨 Visual C++6.0 提供 CHtmlView 類,覆蓋 CHtmlView::DocumentComplete(),並按照步驟 4,使用 CHtmlView 類的該 m_pBrowserApp 成員訪問 WebBrowser 控制項。
在標頭檔為 CWnd / CView 衍生類別中定義 OnDocumentComplete 方法: afx_msg void OnDocumentComplete(LPDISPATCH lpDisp,
VARIANT FAR* URL);
聲明事件接收器在相同的標頭檔中: DECLARE_EVENTSINK_MAP()
在實現檔案 (.cpp) 為 CWnd / CView 衍生類別,實現事件接收器映射: BEGIN_EVENTSINK_MAP(CYourView, CView)
ON_EVENT(CWBTstView, ID_WEB_BROWSE, 259 /* DocumentComplete */,
OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()
實現 OnDocumentComplete 方法: void CWBTstView::OnDocumentComplete(LPDISPATCH lpDisp,
VARIANT FAR* URL)
{
IUnknown* pUnk;
LPDISPATCH lpWBDisp;
HRESULT hr;
pUnk = m_webBrowser.GetControlUnknown();
ASSERT(pUnk);
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr));
if (lpDisp == lpWBDisp )
{
// Top-level Window object, so document has been loaded
TRACE("Web document is finished downloading\n");
}
lpWBDisp->Release();
}
WebBrowser 控制項定位到更改頂級架構的頁面時,此方法適用。 假設是否在導航發生本身,範圍內則觸發的最終 DocumentComplete 的圖文框與不頂層架構。 是例如請考慮如下情形。
WebBrowser 控制項承載一個框架組。 框架組的一個架構中, 使用者單擊一個連結將外框本身中開啟一個新的頁面,並使該框架組的其餘部分保持不變。 建立頁可能再次包含多個架構。 因此,會有多個 DocumentComplete 通知 (一個用於每個新的架構)。 但是,因為更改,頂級架構也不會發生最終 DocumentComplete 會的架構的已更改。
如果您感興趣檢查在這種情況下完成最終文檔,可以執行以下操作: 請檢查該 DocumentComplete 的 IDispatch 參數是否 IDispatch 參數的第一個 NavigateComplete2 事件相同。 因為第一個 NavigateComplete2 是頂級架構,而最後一個 DocumentComplete 還是頂層架構,執行這樣的方式比較將告訴是否完成頁下載。下面是一些樣本 C++ 代碼: LPDISPATCH glpDisp = NULL; // global LPDISPATCH, can also
// be of class scope
// NavigateComplete2 event
void CWebbrDlg::OnNavigateComplete2Explorer1(LPDISPATCH pDisp,
VARIANT FAR* URL)
{
// Check if glpDisp is NULL. If NULL, that means it is
// the top level NavigateComplete2. Save the LPDISPATCH
if (!glpDisp)
glpDisp = pDisp;
}
void CWebbrDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp,
VARIANT FAR* URL)
{
if (glpDisp && glpDisp == pDisp)
{
// if the LPDISPATCH are same, that means
// it is the final DocumentComplete. Reset glpDisp
TRACE("Document is done downloading");
glpDisp = NULL;
}
}
-------------------------------------------------------------------------------------------
還有一個方法如下:
用Webbrowser控制項載入網頁時,通常會用DocumentCompleted事件來指示網頁載入完畢。但當載入的網頁包含frame時,可能會多次觸發該事件,所以不能簡單地通過它來判斷網頁載入完畢。要通過WebBrowserNavigatedEventArgs來判斷。
p rivate void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url != webBrowser1.Document.Url) return;
// 當 e.Url == webBrowser1.Document.Url 我們要的網頁載入完畢
// 載入完畢
// ...
}