windows vs2022 MFC使用webview2嵌入网页

Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎,以在本机应用中显示 web 内容。

一、通过菜单“项目”-“管理NuGet程序包”,下载相关包

二、安装 Microsoft.Web.WebView2

       在“浏览”分页的左上角的搜索栏中,键入 Microsoft.Web.WebView2,选择对应的版本,然后点击按钮安装

三、安装Microsoft.Windows.ImplementationLibrary

在“浏览”分页的左上角的搜索栏中,键入 Microsoft.Windows.ImplementationLibrary,选择对应的版本,然后点击按钮安装

四、添加界面消息映射

在对话框界面右击,选择“类向导”

 添加WM_CREATE和WM_SIZE消息:

五、添加代码

在MFCApplication1Dlg.h头文件中添加:

#include <iostream>
#include <wrl.h>
#include <wil/com.h>
#include "WebView2.h"#include <string>
#include <vector>
using namespace std;
using namespace Microsoft::WRL;// Pointer to WebViewController
static wil::com_ptr<ICoreWebView2Controller> webviewController = nullptr;// Pointer to WebView window
static wil::com_ptr<ICoreWebView2> webview = nullptr;

 在构造函数中添加:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

在析构函数中添加:

CoUninitialize();

在OnSize函数中添加:

if (webviewController != nullptr) {RECT bounds;GetClientRect(&bounds);webviewController->put_Bounds(bounds);
};

在OnCreate函数中添加:

HWND hWnd = this->m_hWnd;// TODO:  在此添加您专用的创建代码// <-- WebView2 sample code starts here -->// Step 3 - Create a single WebView within the parent window// Locate the browser and set up the environment for WebViewCreateCoreWebView2EnvironmentWithOptions(nullptr, nullptr, nullptr,Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>([hWnd](HRESULT result, ICoreWebView2Environment* env) -> HRESULT {// Create a CoreWebView2Controller and get the associated CoreWebView2 whose parent is the main window hWndenv->CreateCoreWebView2Controller(hWnd, Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>([hWnd](HRESULT result, ICoreWebView2Controller* controller) -> HRESULT {if (controller != nullptr) {webviewController = controller;webviewController->get_CoreWebView2(&webview);}// Add a few settings for the webview// The demo step is redundant since the values are the default settingswil::com_ptr<ICoreWebView2Settings> settings;webview->get_Settings(&settings);settings->put_IsScriptEnabled(TRUE);settings->put_AreDefaultScriptDialogsEnabled(TRUE);settings->put_IsWebMessageEnabled(TRUE);// Resize WebView to fit the bounds of the parent windowRECT bounds;::GetClientRect(hWnd, &bounds);webviewController->put_Bounds(bounds);// Schedule an async task to navigate to Bingwebview->Navigate(L"https://www.bing.com/");// <NavigationEvents>// Step 4 - Navigation events// register an ICoreWebView2NavigationStartingEventHandler to cancel any non-https navigationEventRegistrationToken token;webview->add_NavigationStarting(Callback<ICoreWebView2NavigationStartingEventHandler>([](ICoreWebView2* webview, ICoreWebView2NavigationStartingEventArgs* args) -> HRESULT {wil::unique_cotaskmem_string uri;args->get_Uri(&uri);std::wstring source(uri.get());if (source.substr(0, 5) != L"https") {args->put_Cancel(true);}return S_OK;}).Get(), &token);// </NavigationEvents>// <Scripting>// Step 5 - Scripting// Schedule an async task to add initialization script that freezes the Object objectwebview->AddScriptToExecuteOnDocumentCreated(L"Object.freeze(Object);", nullptr);// Schedule an async task to get the document URLwebview->ExecuteScript(L"window.document.URL;", Callback<ICoreWebView2ExecuteScriptCompletedHandler>([](HRESULT errorCode, LPCWSTR resultObjectAsJson) -> HRESULT {LPCWSTR URL = resultObjectAsJson;//doSomethingWithURL(URL);return S_OK;}).Get());// </Scripting>// <CommunicationHostWeb>// Step 6 - Communication between host and web content// Set an event handler for the host to return received message back to the web contentwebview->add_WebMessageReceived(Callback<ICoreWebView2WebMessageReceivedEventHandler>([](ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs* args) -> HRESULT {wil::unique_cotaskmem_string message;args->TryGetWebMessageAsString(&message);// processMessage(&message);webview->PostWebMessageAsString(message.get());return S_OK;}).Get(), &token);// Schedule an async task to add initialization script that// 1) Add an listener to print message from the host// 2) Post document URL to the hostwebview->AddScriptToExecuteOnDocumentCreated(L"window.chrome.webview.addEventListener(\'message\', event => alert(event.data));" \L"window.chrome.webview.postMessage(window.document.URL);",nullptr);// </CommunicationHostWeb>return S_OK;}).Get());return S_OK;}).Get());

六、截图

头文件:

构造函数和析构函数:

OnSize函数:

 

OnCreate函数:

运行截图:

 参考文档:https://blog.51cto.com/fish/6178983

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409359.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构化与面向对象

人类认识世界总是循序渐进的过程&#xff0c;软件工程也一样&#xff0c;从最开始的单兵作战&#xff0c;再到软件作坊&#xff0c;直到如今的大规模软件开发&#xff0c;软件工程从业者不断总结实践中存在的问题以及解决途径&#xff0c;逐渐形成了一系列的软件工程方法&#…

ZooKeeper--基于Kubernetes部署ZooKeeper

ZooKeeper 服务 服务类型: 无头服务&#xff08;clusterIP: None&#xff09;&#xff0c;这是 StatefulSet&#xff08;有状态集&#xff09;必需的配置。 端口: 2181 (客户端): 用于客户端连接。 2888 (跟随者): 用于 ZooKeeper 服务器之间的连接。 3888 (领导者): 用于领导者…

Linux查看jvm相关参数以及设置调优参数

1、查看jvm相关参数 1.1、查看Java进程命令 jcmd会显示出来对应的Java进程id 1.2、查看堆内存各个区域的使用大小、具体大小和GC次数以及耗时 jstat -gc 4036145jstat -gc 进程id 各个参数的含义。 如上图,4036145的进程,FGCT是0.452,FGC是4.平均每次full gc耗时0.11秒。 …

Android13系统源码内置App并通过AIDL调用获取内置存储卡的真实大小

jix 进行从事Android系统源码开发不得不在原有的系统上内置自己的App。通过内置App一般都需要调用些系统才能访问的系统级App。App的部署和调试需要依赖源码系统。通过命令 &#xff1a; mm 来实现。 第三方App想调用内置的app需要通过跨进程调用。 这里通过AIDL来实现跨进程…

Qt第二十章 数据库操作

文章目录 Qt操作数据库QSqlDataBaseQSqlQuery执行SQL语句 QSqlRecordQSqlField数据库模型QSqlQueryModelQSqlTableModelQSqlRelationalTableModel 编译MySql驱动msvc版本MySql客户端程序部署 Qt操作数据库 需要在cmakelist加上Sql模块 QSqlDataBase 可以通过静态成员查看支持的…

苹果已删除照片的恢复方法有哪些?盘点几种实用办法

苹果设备上的照片往往是珍贵的回忆&#xff0c;但不小心删除照片的情况时有发生。幸运的是&#xff0c;苹果提供了几种方法来帮助用户恢复已删除的照片。本文将详细介绍几种有效的恢复方法&#xff0c;帮助您找回那些重要的照片。 方法一&#xff1a;通过“最近删除”文件夹恢复…

SQL-DCL-数据控制语言

一、 DCL-管理用户 二、DCL-权限控制 一、 DCL-管理用户,主要是DBA数据库管理员使用&#xff0c;开发使用较少 # 1、查询用户 use mysql; show tables; desc user; select * from user; # host为主机地址, 主机地址和用户名确定唯一性# 2、创建用户 create user itcastlocalh…

【AD9361 数字基带】多片基带内FPGA补偿 I/Q Rotation

I/Q 旋转 Rotation 在许多多通道射频系统中&#xff0c;如 AD-FMCOMMS5&#xff0c;甚至在 AD-FMCOMMS2、AD-FMCOMMS3 上&#xff0c;都需要测量或校正两个复数 &#xff08;I/Q&#xff09; RF 信号之间的相位差。 从纯粹的数学描述来看&#xff0c;单个正弦波没有相位&…

【数学建模】趣味数学模型——等额还款数学模型

问题 在银行贷款中&#xff0c;通常采用等额还款。假定银行贷款的年利率为 p&#xff0c;贷款 k 元&#xff0c;分 m 年采用每月等额还款方式还清。问每月还款多少钱&#xff1f;总共还的钱是多少&#xff1f;每月还款中还本金和利息各是多少元&#xff1f; 如果考虑每月等额…

VTK随笔一:初识VTK(QT中嵌入VTK窗口)

VTK&#xff08;Visualization Toolkit&#xff09;是一个用于可视化和图形处理的开源软件库。它提供了一系列的算法和工具&#xff0c;可以用来创建、渲染和处理二维和三维的图形数据。VTK可以在多个平台上运行&#xff0c;并支持各种编程语言&#xff0c;包括C、Python和Java…

基于Springboot + vue + mysql 车辆充电桩管理系统 设计实现

目录 &#x1f4da; 前言 &#x1f4d1;摘要 1.1 研究背景 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; E-R表 3.4.2 数据库具体设计 系统功能模块 系统首页 用户注册 充电桩 个人中心 用户后台管理模块 用户登录…

完成课题ssrf实现.SSH未创建写shell,同时完成其他漏洞复现

SSRF 一种网络安全漏洞&#xff0c;发生在服务器端应用程序中&#xff0c;允许攻击者通过服务器向任意网络资源发送请求&#xff0c;而无需用户直接参与。这种漏洞通常源于程序设计错误&#xff0c;例如当应用程序使用用户的输入作为URL请求的一部分&#xff0c;而没有适当的验…

Ansible初识

ansible初识 Ansible是一种自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它基于Python语言开发&#xff0c;使用SSH协议进行通信&#xff0c;并且不需要在被管理的主机上安装任何客户端。Ansible使用简单的YAML语言来描述任务和配置&#xff0c;使得操作简…

Vue3的三种样式控制及实现原理

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 Vue3中一共有三种样式控制&#xff0c;分别是全局样式控制、局部作用域样式控制和深度样式控制&#xff0c;今天我们一起看下这三种样式控制的使用&#xff0c;以及实现的原理是什么。 一、全局样式控制…

NRK3301语音识别芯片在汽车内饰氛围灯上的应用方案解析

随着智能汽车的快速发展&#xff0c;车载语音交互技术逐渐成为提升驾驶体验的关键技术之一。传统的汽车内饰氛围灯语音识别系统往往依赖于手动操作&#xff0c;不仅操作繁琐&#xff0c;而且在驾驶过程中容易分散驾驶员的注意力。因此&#xff0c;开发一种高效、便捷的汽车内饰…

SpringBoot集成Redis

目录 12.1 配置文件12.2 防火墙12.3 Jedis(一般不用了&#xff0c;了解即可)1.介绍2.步骤3.写YML4.主启动5.业务类 12.4 Lettuce1.介绍以及和Jedis的区别2.步骤1.改pom2.业务类 12.5 Redis Template(推荐)1.连接单机1.改pom2.写YML3.业务类3.1配置类3.2 service3.3 controller测…

Stable Diffusion的微调方法原理总结

在深度学习领域&#xff0c;Stable Diffusion作为一种强大的生成模型&#xff0c;正逐渐成为图像和视频生成领域的热门话题。它不仅能够模拟复杂的自然和人工系统中的随机演化行为&#xff0c;还通过一系列微调方法&#xff0c;显著提升了模型在特定任务上的性能。本文旨在深入…

开放式耳机别人能听到吗?开放式的防漏音效果到底好不好?

开放式耳机的设计是允许一部分声音泄露出来&#xff0c;所以当您使用开放式耳机听音乐或通话时&#xff0c;周围的人可能会有所察觉。具体别人能听到多少&#xff0c;取决于几个因素&#xff1a; 音量大小&#xff1a;如果音量设置得比较高&#xff0c;那么周围的人更容易听到…

多线程面试常问

一、创建线程的几种方式 1、继承Thread类并重写run()方法。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("通过集成 Thread 类实现线程"); } } // 如何使用 new MyThread().start() 2、实现Runnable接口并重写run()方法…

Linux文件系统及常见快捷键

Linux文件系统及常用快捷键 (只是对linux简单的介绍,新手常用的快捷键) 1、Linux文件系统结构 windows文件系统 Windows操作系统将硬盘进行分区&#xff0c;然后用 A 、 B 、 C 、 D 、等符号标识。存取文件时一定要清楚存放在哪个磁盘的哪个目录下。 Linux 文件系统结构 …