CHtmlView / WebBrowser2 如何真正知道DocumentComplete

MFC集成WebBrowser控件实战:从基础创建到C++/JS双向通信 在Windows桌面开发中,将Web内容嵌入原生应用是常见的需求,这通常通过浏览器控件实现。其核心原理是利用操作系统提供的浏览器渲染引擎,在应用窗口中创建一个可交互的网页容器。这项技术的价值在于能够融合Web的动态内容、丰富交互与原生应用的系统级能力,实现混合应用开发。典型的应用场景包括内嵌报表展示、在线文档查看、地图集成以及需要Web界面但又要调用本地功能的客户端程序。本文聚焦于MFC框架,深入探讨了如何集成经典的WebBrowser控件,涵盖了CHtmlView与手动创建两种方案,并详细解析了C++与J 阅读详情
 

CHtmlView / WebBrowser2 如何真正知道DocumentComplete

  (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。)
虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。

virtual void OnDocumentComplete(
   LPCTSTR lpszURL
);
但这个事件在网页存在 frame 的时候不再那么有效了,因为一旦某个frame激发了OnDownloadBegin,那么就会激发OnDocumentComplete,结果你会发现你的一个网页激发了多个OnDocumentComplete,而你也不知道哪个OnDocumentComplete真正能告诉你网页处理完毕了。

 

解决办法有三个:

  方法一: 通过CHtmlView::OnProgressChange获取结束事件。 不理会OnDocumentComplete,

在OnProgressChange中有两个参数:
virtual void OnProgressChange(
   long nProgress,
   long nProgressMax
);
  当第一个参数nProgress为-1时表示网页处理完毕。

  另外两种方法可以在微软的知识库获得:
  http://support.microsoft.com/support/kb/articles/q180/3/66.asp
  HOWTO: Determine When a Page Is Done Loading in WebBrowser Control
  Q180366
 
  对于其中的方法一有一点补充,在上文support的代码中其在通过调用GetControlUnknown()获得WebBrowser控件的IUnknown指针后调用Release将接口释放了。
 这是千万不行的!这将导致你的WebBrowser控件无法清除,详细可以参见MSDN对CWnd::GetControlUnknown的介绍。


 

MSHTML 一点经验


很多IE编程的人都想对一些网页的元素、内容进行分析、改动或者别的什么。

无论你用WebBrowser控件、CHtmlView还是连接IE,都必须跟IHtmlDocument2接口打交道。

下面我作为一个认识IHtmlDocument2不久的新手给大家介绍一些跟它相处的经验。

IHtmlDocument2是MSHTML大堂的入口,只有从这个入口进去你才能找到别的门(厕所、餐厅、、、等等)

所以不论你是想做自动填表还是替换脚本,你都先要获得IHtmlDocument2接口,从它通过。

获取IHtmlDocument2的方法一是:

1,通过IWebBrowser2::get_Document(假设你使用IWebBrowser2,CHtmlView等等与其类似)获得文档的IDispatch 指针.

2,通过QueryInterface在上一步的指针基础上查询IID_IHTMLDocument2

闲麻烦就略过二,直接强制转换,例如:

CHtmlView* pView = ....

IHTMLDocument2 * pDoc = (IHTMLDocument2*)(pView->GetHtmlDocument());

获得了IHTMLDocument2之后你必定要获得其他接口。

IHTMLDocument2 提供了很多方法,比如all方法可以返回IHTMLElementCollection

没法给太多实例,我的机器一打开MSDN就出现hh.exe出现非法操作[可能中毒?],所以具体方法你看MSDN即可,获得这些元素的方法类似于获得IHTMLDocument2接口的方法,所以只要你懂点儿COM也能完成它,有一点强调的是(对于新手)比如IHTMLDocument2 的get_all方法获得的是IHTMLElementCollection,你觉不能通过get_all获得 IHTMLInputTextElement。

在这里,每一步调用的结果都做判断是个好习惯,避免出现调用空指针等等,免得等你的程序出现一大堆非法操作的时候发懵。

下面说的就是取和赋,最常用的就是取值和赋值,比如你要给网页中所有的表单都填写上111222,那么你就要用put_value。

如果你要给一个<input name=who type=text>的输入框赋值就必须先找到这个输入框。

无疑这又将用到get_name获取名字,比较其是否为who,是的话就put_value上去。

有时间我整理一些简单的(难的俺写不出来)应用实例给大家.....zZz~~~~

(犯困了,就胡说到这吧,拜拜了您呐)


相关文章
基于CHtmlView的网页浏览器 具备浏览器的基本功能,使用CDialogBar实现地址栏,在状态栏中添加进度条,使用SliderCtrl控制网页缩放 立即下载

相关推荐

CHTMLView(简单浏览器)设计

CHTMLView(简单浏览器)设计,输入网站,访问,刷新,停止返回

MFC对话框里利用CHtmlView加载界面(一)————加载网页

简单了解下CHtmlView类,CHtmlView类是MFC类,它继承自CView,属于MFC视图类。 但我们看它的具体实现时,我们会发现其最大的本质在于IWebBrowser2(WebBrowser ActiveX 控件)的封装。即其实质是:利用IWebBrowser2,有效地使应用程序成为一个 Web 浏览器。当然里面具体的封装细节,涉及到了大量的COM组件和ActiveX 控件知识

qq_20828983的博客 8332

关于CHtmlView的简单应用关于CHtmlView的简单应用

关于CHtmlView的简单应用关于CHtmlView的简单应用关于CHtmlView的简单应用关于CHtmlView的简单应用关于CHtmlView的简单应用关于CHtmlView的简单应用

MFC对话框里利用CHtmlView加载界面(四)————分层窗口设置

在学会了 利用CHtmlView 在MFC对话框上显示网页,并支持JavaScript 和 MFC 之间的互相通信后。 当然就想: 我们为什么不能只用HTML 作为前端界面, 而底层用MFC实现逻辑呢? 这样就完全不需要用到MFC对话框的界面风格了。 本文就讲告诉大家如何实现 用HTML代替MFC的对话框界面。

qq_20828983的博客 6404

攻防世界 misc题GFSJ1129-【您看我还有机会吗?】

我们发现了隐藏内容,一开始我以为那个英文就是flag,提交后发现不对,然后我想只有一张图片然后图片上的隐写内容又不是flag,那必定还有什么文件被隐藏了,于是我们打开VMware并启动Ubuntu,使用binwalk分析一下有没有隐藏文件,我们要在Terminal中分析,如下。我们发现里面有一个flag.txt文件,我们尝试提取里面内容,但发现又要密码,我们想起了之前图片上的隐藏内容,我们将那段英文输入(包括空格和符号,在VMware中输入密码不会有显示,你看到的就像没输入一样),然后我们看到如下。

大数据专业,关注 AI 安全与数学建模。记录 Web 安全、对抗攻击、隐私保护等安全实践,以及从经典模型到智能方法的建模思考。用数学思维理解 AI,用 AI 方法反哺安全与建模。 1094

MaxKey+JeecgBoot单点登录实战:手把手教你从零配置到账户同步

本文提供MaxKey与JeecgBoot单点登录(SSO)的实战整合指南。详细讲解从MaxKey应用注册、JeecgBoot前后端改造,到最终实现账户同步的完整步骤,重点解决Shiro配置、令牌交换等关键问题,帮助企业构建统一、可扩展的身份管理体系。

weixin_29258297的博客 541

MFC界面--利用CHtmlView和HTML制作新风格的界面(包括CView和Dialog)

一、文档视图形式,以一个视图cview(chtmlview)作为首页界面 转自:http://liuxiang031130.blog.163.com/blog/static/1176665520111117914849/ 用过 Outlook Express 的很多人都对其第一页的 HTML 界面感到新奇,很明显这是使用 DHTML 技术,加入了一些 Java Script 的一个网页,但它能

Wait的专栏 1万+

Obsidian与GPT协作:数学公式从KaTeX到MathJax的无缝转换实践

本文针对Obsidian用户从GPT等AI助手复制数学公式时遇到的KaTeX与MathJax格式不兼容问题,提供了高效的解决方案。重点介绍了KaTeX to MathJax插件的核心作用,它能自动将AI生成的KaTeX格式公式(如\(...\))无缝转换为Obsidian默认支持的MathJax格式($...$),实现复制粘贴后公式即时渲染,极大提升了数学笔记与AI协作的效率和流畅度。

weixin_29209825的博客 136

CHtmlView WebBrowser2 如何真正知道DocumentComplete

转自:http://www.jdzj.com/data/program/3919.htm CHtmlView WebBrowser2 如何真正知道DocumentComplete   (下文针对CHtmlView,由于WebBrowser2与其类似不再累赘。) 虽然CHtmlView提供了下面虚函数来得到文档解析完毕的事件。 virtual void OnDocumentCom

FoxBryant的专栏 1581

用Linkboy玩转Arduino:3小时搞定智能倒车雷达(附仿真文件下载)

本文详细介绍了如何利用Linkboy图形化编程工具,在3小时内快速搭建一个基于Arduino的智能倒车雷达项目。通过仿真环境,初学者无需硬件即可学习超声波测距原理、报警逻辑设计,并完成从虚拟仿真到实体硬件的完整流程。文章提供了清晰的步骤、调试技巧及功能扩展思路,并附有仿真文件,是入门Arduino和智能硬件制作的绝佳实践指南。

weixin_29159441的博客 403

【已解决】如何在服务器中下载huggingface模型,解决huggingface无法连接

在服务器上使用huggingface模型时,如果直接指定模型名称,用AutoTokenizer.from_pretrained(“model_name”),可能会由于网络原因会报错 Failed to connect to huggingface.co port 443 after 75018 ms: Operation time out因此我们需要下载模型到服务器上,得到模型本地的路径model_dir,再通过AutoTokenizer.from_pretrained(model_dir)方式来使用。

a61022706的博客 4万+

CHtmlView 和 Webbrowser 控件中超链接点击事件的获取与检测

http://live.aulddays.com/tech/08/chtmlviewlinkclick/ 在自己的程序中使用 CHtmlView 或直接嵌入 Webbrowser 控件显示网页时,常常需要获取网页元素的一些事件,以实现对网页显示的控制或与网页元素进行交互。最常见的莫过于获取用户对网页上超链接的所有点击事件。要实现这个需求,在 MSDN中描述了接收网页元素事件的基本方法,但

codespad的专栏 968

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2600

HTML(1):WebBrowser

http://blog.youkuaiyun.com/vcmute/archive/2005/10/31/520065.aspx Q CWebBrowser2的用法 T  我如何在一个函数中自己动态(因为我不需要对话框)创建CWebBrowser2控件,实现打印一个指定.htm文件的功能? A to printm_wndWebbrowser2.ExecWB(OLECMDID_PRINT, OLECMD

清风专栏 5215

万字长文,YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

Coding... 1万+

36、转子 - 主动磁轴承系统建模及密封性能研究

本文研究了转子-主动磁轴承(AMBs)系统的动力学建模、稳定性分析及密封性能。通过建立包含转子、电子控制系统和接口接触的机电模型,结合Bernoulli-Euler梁理论与弹簧单元等效法,构建了考虑接口接触的闭环系统模型,并在磁悬浮鼓风机和电机上进行数值模拟与实验验证,结果表明接口接触刚度显著影响系统稳定性,尤其在高预紧扭矩下易激发弯曲模态失稳。同时,对非接触式低温密封进行了CFD仿真与实验测试,发现浮动环密封(FRS)具有最优的泄漏控制和抗磨损性能。研究成果为提升高速旋转机械的稳定性和密封可靠性提供了理论

vim8coder的博客 134

利用IWebBrowser2的IWebBrowser2::get_Document得doc对象

 two   way   to   get   HTML   interfaces     1   call   CWnd::GetControlUnknown   to   get   IWebbrowser2   Interface     LPUNKNOWN   lpUnk   =   m_wndBrowser.GetControlUnknown();     HRESULT   hr  

xuanwu1015的专栏 5962

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

从一个窗口句柄获取IWebBrowser2和IHTMLDocument2接口

将以下代码张贴到对话框程序,运行即可。调用之前请确保打开IE浏览器 /**************************************************************************** 寻找指定类名的子窗口句柄  *********************************************************

jiangqin115的专栏 2889

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MFC中CHtmlView和JS的相互调用

没废话,直接上步骤: 1、创建一个继承自CHtmlView

AndyCoder的专栏 3932

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VC6中使用CHtmlView在对话框控制中显示HTML文件

在Visual Studio 6.0中出现了一个新类CHtmlView,利用这个类,我们可以实现在对话框的控制中显示HTML文件。 要想使用CHtmlView类,对它的定义和实现就必须有全面深入的理解。我们不妨拿CHtmlView和CListView做一个比较,通过比较这两个 类,我们会发现一些有趣的差别。首先,MFC中CListView有一个对应的CListCtrl类,而CHtmlView却没有...

weixin_34232744的博客 1443

CHtmlView-MFC中文手册

CHtmlView CObject  └CCmdTarget     └CWnd        └CView           └CScrollView              └CFormView                 └CHtmlView CHtmlView类在文档/视图结构的上下文中

Mirage520的专栏 1304
上一篇: IE编程技巧大全
下一篇: Internet Explorer下载文件的终极过滤
skyremember
博客等级 码龄20年 204粉丝 484原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值