c#,WebBrowser 判断网页是否加载完毕

摘要:
然而,当加载的页面包含一个帧时,此事件可能会被多次触发,因此无法用于判断页面加载的完成。这表示WebBrowser控件已完成下载网页。要检查是否未执行页面下载,需要检查IDispatch*参数是否与WebBrowser控件的IDispatch相同。对于Visual Basic,以下代码用于执行此检查:PrivateSubWebBrowser1_DocumentCompleteIfThenBug.打印“Webdocumentsfinisheddownloading”EndIfEndSub若要在Visual C++中处理DocumentComplete事件并确定网页下载是否完成,请执行以下步骤。请注意,执行的步骤取决于如何使用WebBrowser控件。如果要创建WebBrowser控件CWnd/View对象,必须执行步骤1到4。

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 我们要的网页加载完毕
    // 加载完毕
    // ...
}

  • 相关阅读:
    333333
    钢镚儿冲刺一周期第六天
    钢镚儿冲刺一周期第五天
    钢镚儿冲刺一周期第四天
    钢镚儿冲刺一周期第三天
    钢镚儿冲刺一周期第二天
    钢镚儿冲刺一周期第一天
    软件工程第九周总结
    CVPR论文的爬取
    构建之法读后感第五
  • 原文地址:https://www.cnblogs.com/hackpig/p/1668365.html
  • 免责声明:文章转载自《c#,WebBrowser 判断网页是否加载完毕》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

    上篇用于读取和写入文本文件Verilog代码devServer之proxy跨域下篇

    宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

    相关文章

    .NET Core开源快速开发框架Colder发布 (NET Core2.1+AdminLTE版)

    引言 上星期发布的.NET452+AdminLTE版框架得到了大家的大力支持,目前GitHub已获近100星,鄙人十分高兴能够帮助大家。其中有不少关心.NET Core的支持情况,因为未来的.NET平台是属于.NET Core的,为此,鄙人花了一星期将代码移植到.NET Core2.1,不负众托,在此推出NETCore+AdminLTE版。 简介 本框架旨...

    TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方面的内容,也有做过一些Demo(包括整理出来的、可供学习使用的简单通信框架)。具体可以参见以下博客: http://www.cnblogs.com/xia...

    怎么理解Laravel的核心架构

    使用过larave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器、视图、模型)之外,还有中间件、门面、契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一下。 首先应该了解laravel框架的架构模式(设计核心,laravel 框架是使用服务组件化的开发模式开发的,laravel框架就是由不同的服务组件构成的...

    混合开发的几个框架

      下面给大家介绍几个最厉害的混合开发框架:   1.IONIC 是目前最有潜力的一款HTML5手机应用开发框架。通过SASS构建应用程序,它提供了很多UI组件来帮助开发者开发强大的应用。它使用JavaScript MVVM框架和 AngularJS来增强应用。提供数据的双向绑定,使用它成为Web和移动开发者的共同选择。即将发布的AngularJS 2.0...

    3、YishaAdmin开源框架搭建

    框架:vs2019、.net core 3.1 SDK 下载地址:https://github.com/liukuo362573/YiShaAdmin 数据库: 1). MySql >= 5.7 (本项目选择mysql数据库) 2). SqlServer >= Sql Server 2012 3). Oracle >= Oracle DB...

    Vue.js框架:IDEA中vue文件代码自动补全设置

    一、初始效果 默认的vue文件,在IDEA中编辑起来和在记事本中没啥差别,没有颜色区分,没有自动补全。 二、设置方法 1、安装vue.js插件: (1)搜索vue.js插件进行安装: File->Settings->Plugins: 重启IDEA使其生效。 (2)配置vue文件模板: File->Settings->File T...