如题所述
{
int i=0;
string sUrl;
while (true)
{
Delay(50); //系统延迟50毫秒,够少了吧!
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete) //先判断是否发生完成事件。
{
if (!webBrowser1.IsBusy) //再判断是浏览器是否繁忙
{
i = i + 1;
if (i == 2) //为什么 是2呢?因为每次加载frame完成时就会置IsBusy为false,未完成就就置IsBusy为false,你想一想,加载一次,然后再一次,再一次...... 最后一次.......
{
sUrl = webBrowser1.Url.ToString();
if (sUrl.Contains("res")) //这是判断没有网络的情况下
{
return false;
}
else
{
return true;
}
}
continue;
}
i=0;
}
}
解决这一问题的其他方法及问题
一、通过DocumentCompleted 事件
每一次网页完成之后都后发送DocumentCompleted 事件,但是拥有多个frame时,浏览器就会发送多个DocumentCompleted事件,所以到最后也无法最终判断网页最终什么时候加载完成。
二、通过webBrowser.ReadyState
通过每一次读取webBrowser.ReadyState,如同上前面所列的一样,每一次DocumentCompleted完成之事都会置ReadyState为Complete ,所以还是无法准确判断网页是否完成准确的判断。
三、通过webBrowser.IsBusy
有的人甚至在此基础上判断什么URL或者加Timer等,程序复杂,效果也不太理想。
一、通过DocumentCompleted 事件
二、通过webBrowser.ReadyState
三、通过webBrowser.IsBusy。
同时给你提供以下图片中的代码,可以完全解决。
WebBrowser加载完页面后,会执行 DocumentCompleted()事件
创建一个变量记录状态,
在设置 Me.WebBrowser1.Navigate() 时设置变量为初始
在 WebBrowser1_DocumentCompleted()中触发更改变量为完成状态.
通过每一次读取webBrowser.ReadyState,每一次DocumentCompleted完成之事都会置ReadyState为Complete ,所以还是无法准确判断网页是否完成准确的判断。 下面看看我的代码: private void Delay(int Millisecond) //延迟系统时间,但系统又能同时能执行其它任务;{DateTime current = DateTime.Now; while (current.AddMilliseconds(Millisecond) DateTime.Now){Application.DoEvents();//转让控制权}return;}主要的函数: private bool WaitWebPageLoad(){int i=0;string sUrl; while (true){Delay(50); //系统延迟50毫秒,够少了吧! if (webBrowser1.ReadyState == WebBrowserReadyState.Complete) //先判断是否发生完成事件。{if (!webBrowser1.IsBusy) //再判断是浏览器是否繁忙{i = i + 1;if (i == 2) //为什么 是2呢?因为每次加载frame完成时就会置IsBusy为false,未完成就就置IsBusy为false,你想一想,加载一次,然后再一次,再一次...... 最后一次.......{sUrl = webBrowser1.Url.ToString();