• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2026-01-31 19:34 Aet 隐藏边栏 |   抢沙发  1 
文章评分 1 次,平均分 5.0

WebBrowser

概述

  1. WebBrowser 控件是微软提供的用于在 Windows 应用程序中嵌入浏览器功能的 ActiveX 控件
  2. 基于 Internet ExplorerTrident 渲染引擎

框架

  1. 核心接口:
    1. 主要通过 IWebBrowser2 COM 接口进行编程控制。
  2. 渲染引擎
    1. 使用 Internet ExplorerTrident 引擎渲染网页内容
  3. 宿主方式
    1. 作为 ActiveX 控件托管在应用程序窗口中。
  4. 支持框架
    1. 可在 MFCATLWTL、原生 Win32 等多种 C++ 框架中使用

MFC 中使用

  1. MFC 提供了 CHtmlViewCWebBrowser2 封装类,简化了 WebBrowser 控件的使用
  2. CHtmlView
    1. 创建基于 CHtmlView 的视图类,自动包含浏览器功能。调用 Navigate2 方法加载页面
    2. 重写 OnBeforeNavigate2OnDocumentComplete 等虚函数处理事件
  3. CWebBrowser2
    1. 在对话框或窗口中动态创建控件。调用 Create 方法指定位置和大小
    2. 通过成员函数控制浏览器行为
  4. 示例

原生 Win32中使用

  1. 完全使用 COM API 进行操作,需要创建 AtlAxWin 窗口类承载控件

  2. 使用 CoCreateInstance 创建 WebBrowser 实例

  3. 通过连接点(Connection Points)机制接收事件

  4. 示例

注意事项

  1. 浏览器模式控制
    1. 默认情况下 WebBrowser 控件运行在 IE7 兼容模式
    2. 需要通过注册表设置 FEATURE_BROWSER_EMULATION 来指定模拟的 IE 版本(如 IE11)
    3. 注册表路径:HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
      键名为应用程序名称,值为版本号(如 11001 表示 IE11)
  2. 线程模型
    1. 必须在 STA(Single-Threaded Apartment)线程中使用
    2. 调用 CoInitializeEx 时使用 COINIT_APARTMENTTHREADED 参数
  3. 事件接收
    1. 需要实现 IDispatch 接口来接收事件通知,或使用 ATLIDispEventImpl 简化事件处理
    2. 常见事件包括 BeforeNavigate2NavigateComplete2DocumentComplete
  4. 脚本交互:
    1. 通过 IHTMLDocument2 接口访问 DOM
    2. 使用 window.external 机制实现 JavaScript 调用 C++ 代码,需要实现 IDocHostUIHandler 接口
  5. 内存管理
    1. 使用 COM 智能指针(如 CComPtr_com_ptr_t)管理接口生命周期
    2. 确保在适当时机释放接口,调用 Release 方法

IWebBrowser2

概述

  1. IWebBrowser2WebBrowser 控件的 COM 接口,基于 Internet Explorer (Trident 引擎)
  2. 它允许在 Windows 应用程序中嵌入浏览器功能,支持 ActiveXCOM 等传统技术
  3. 现在已被 WebView2 取代

使用方法

  1. 初始化 COM 库:
    1. 调用 CoInitializeCoInitializeEx 初始化 COM 环境
  2. 创建实例:
    1. 使用 CoCreateInstance 创建 WebBrowser 控件实例,CLSIDCLSID_WebBrowser
  3. 获取接口:
    1. 通过 QueryInterface 获取 IWebBrowser2 接口指针
  4. 导航页面:
    1. 调用 NavigateNavigate2 方法加载 URL
  5. 事件处理:
    1. 实现 DWebBrowserEvents2 接口来处理浏览器事件(如页面加载完成、导航等)

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享