Webbrowser控件判斷網(wǎng)頁(yè)加載完畢的簡(jiǎn)單方法
2007-03-04
一般情況下,當(dāng)ReadyState屬性變成READYSTATE_COMPLETE時(shí),Webbrowser控件會(huì)通過(guò)觸發(fā)DocumentCompleted事件來(lái)指示網(wǎng)頁(yè)加載完畢。但當(dāng)加載的網(wǎng)頁(yè)包含frame時(shí),可能會(huì)多次觸發(fā)該事件,所以不能簡(jiǎn)單地通過(guò)它來(lái)判斷網(wǎng)頁(yè)加載完畢。
從微軟的官方網(wǎng)站上了解到,并非每個(gè)frame都對(duì)應(yīng)了一個(gè)DocumentCompleted事件,只有觸發(fā)了DownloadBegin事件的frame才會(huì)有相應(yīng)的DocumentCompleted事件。另外,最外層的frame總是最后觸發(fā)DocumentCompleted事件。DocumentCompleted事件具有一個(gè)IDispatch *類(lèi)型的參數(shù),它指示了是在哪個(gè)frame上觸發(fā)的該事件。所以,要判斷文檔是否加載完畢,只需要判斷IDispatch *參數(shù)是否是Webbrowser控件的IDispatch。
微軟support網(wǎng)站上關(guān)于這個(gè)問(wèn)題的說(shuō)明:
http://support.microsoft.com/?scid=kb%3Ben-us%3B180366&x=9&y=14
這個(gè)方法用到了COM相關(guān)的知識(shí),在沒(méi)有現(xiàn)成代碼的情況下,對(duì)于像我這樣從.NET開(kāi)始進(jìn)入Windows平臺(tái)的程序員來(lái)講理解和實(shí)現(xiàn)起來(lái)都有一定的難度。尤其是.NET 2.0下的Webbrowser控件是對(duì)Webbrowser COM組件的不完全封裝,我在考察.NET 2.0 Webbrowser的WebBrowserDocumentCompletedEventArgs后并未發(fā)現(xiàn)有IDispatch參數(shù)或相關(guān)參數(shù)。不知道是不是在封裝過(guò)程中被省去了。
希望哪位高手能告訴我如何用C#實(shí)現(xiàn)上面的方法,先在此謝過(guò)!不過(guò),利用前面提到的最外層的frame總是最后觸發(fā)DocumentCompleted事件,還有一種更為簡(jiǎn)單的方法:
1. 引入一個(gè)計(jì)數(shù)器變量,初始值為0;
2. 當(dāng)Webbrowser控件的DownloadBegin (.NET 2.0中的Navigated)事件發(fā)生時(shí)對(duì)計(jì)數(shù)器加一;
3. 當(dāng)Webbrowser控件的DownloadCompleted事件發(fā)生時(shí)對(duì)計(jì)數(shù)器減一;
4. 計(jì)數(shù)器減為0說(shuō)明文檔加載完畢
主要代碼:
//
計(jì)數(shù)器
int
?counter?
=
?
0
;




//
添加事件響應(yīng)函數(shù)
this
.webBrowser.Navigated?
+=
?
new
?System.Windows.Forms.WebBrowserNavigatedEventHandler(webBrowser_Navigated);

this
.webBrowser.DocumentCompleted?
+=
?
new
?System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(
this
.webBrowser_DocumentCompleted);

//
事件響應(yīng)函數(shù)
private
?
void
?webBrowser_Navigated(
object
?sender,?WebBrowserNavigatedEventArgs?e)

{
????counter
++
;
}
private
?
void
?webBrowser_DocumentCompleted(
object
?sender,?WebBrowserDocumentCompletedEventArgs?e)

{
????counter
--
;

????
if
?(
0
?
==
?counter)

????
{
????
?
//
加載完畢
????}
}
一般情況下,當(dāng)ReadyState屬性變成READYSTATE_COMPLETE時(shí),Webbrowser控件會(huì)通過(guò)觸發(fā)DocumentCompleted事件來(lái)指示網(wǎng)頁(yè)加載完畢。但當(dāng)加載的網(wǎng)頁(yè)包含frame時(shí),可能會(huì)多次觸發(fā)該事件,所以不能簡(jiǎn)單地通過(guò)它來(lái)判斷網(wǎng)頁(yè)加載完畢。
從微軟的官方網(wǎng)站上了解到,并非每個(gè)frame都對(duì)應(yīng)了一個(gè)DocumentCompleted事件,只有觸發(fā)了DownloadBegin事件的frame才會(huì)有相應(yīng)的DocumentCompleted事件。另外,最外層的frame總是最后觸發(fā)DocumentCompleted事件。DocumentCompleted事件具有一個(gè)IDispatch *類(lèi)型的參數(shù),它指示了是在哪個(gè)frame上觸發(fā)的該事件。所以,要判斷文檔是否加載完畢,只需要判斷IDispatch *參數(shù)是否是Webbrowser控件的IDispatch。
微軟support網(wǎng)站上關(guān)于這個(gè)問(wèn)題的說(shuō)明:
http://support.microsoft.com/?scid=kb%3Ben-us%3B180366&x=9&y=14
這個(gè)方法用到了COM相關(guān)的知識(shí),在沒(méi)有現(xiàn)成代碼的情況下,對(duì)于像我這樣從.NET開(kāi)始進(jìn)入Windows平臺(tái)的程序員來(lái)講理解和實(shí)現(xiàn)起來(lái)都有一定的難度。尤其是.NET 2.0下的Webbrowser控件是對(duì)Webbrowser COM組件的不完全封裝,我在考察.NET 2.0 Webbrowser的WebBrowserDocumentCompletedEventArgs后并未發(fā)現(xiàn)有IDispatch參數(shù)或相關(guān)參數(shù)。不知道是不是在封裝過(guò)程中被省去了。
希望哪位高手能告訴我如何用C#實(shí)現(xiàn)上面的方法,先在此謝過(guò)!不過(guò),利用前面提到的最外層的frame總是最后觸發(fā)DocumentCompleted事件,還有一種更為簡(jiǎn)單的方法:
1. 引入一個(gè)計(jì)數(shù)器變量,初始值為0;
2. 當(dāng)Webbrowser控件的DownloadBegin (.NET 2.0中的Navigated)事件發(fā)生時(shí)對(duì)計(jì)數(shù)器加一;
3. 當(dāng)Webbrowser控件的DownloadCompleted事件發(fā)生時(shí)對(duì)計(jì)數(shù)器減一;
4. 計(jì)數(shù)器減為0說(shuō)明文檔加載完畢
主要代碼:

































posted on 2007-03-04 22:10 weidagang2046 閱讀(28061) 評(píng)論(12) 編輯 收藏