一步步CEF(3)之JavaScript与C++互动

QT集成CEF10-JavaScript与C++互调 我们为什么要使用CEF? 很多情况下都是为了能够实现JavaScript与 native C++之间的相互调用。即网页中的JavaScript调用的时候,触发本地C++代码的执行,比如访问硬件等JavaScript无法完成的功能。本地C++代码也可以回调JavaScript,比如本地代码收到操作系统的一些通知后,将通知内容转交给JavaScript代码来执行。 ​ CEF中,JavaScript代码是运行在Renderer进行中的,理解这一点非常重要,native代码写的地方不合适,JavaScript代码 阅读详情

随便先提提,cefclient默认编译就是标准的浏览器。

 

如果不希望看到按钮和url输入框的话,那就将“window_config.with_controls = false;”就可以去掉,不过弹窗的时候还是会有,要在另外的地方修改,类似的地方自行去找。

如果要实现离屏(OSR),不用改太多,只需要改一下:


		CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();
		command_line->InitFromString(::GetCommandLineW());
		command_line->AppendSwitch(switches::kOffScreenRenderingEnabled);
		command_line->AppendSwitchWithValue(switches::kOffScreenFrameRate, "30");
		command_line->AppendSwitch(switches::kTransparentPaintingEnabled);

JavaScript和C++交互:

C++调用JavaScript比较简单:

CefRefPtr<CefBrowser> browser = rootWin->GetBrowser();
CefRefPtr<CefFrame> frame = rootWin->GetBrowser()->GetMainFrame();
frame->ExecuteJavaScript(“alert('haha')”, frame->GetURL(), 0);

如果要回调的话,要用window.cefQuery();

frame->ExecuteJavaScript("window.cefQuery({request: 'mssage aaa',onSuccess: function(response) {target.innerText = response;},onFailure: function(error_code, error_message) {}});;", frame->GetURL(), 0);

这个还没完。还要将下面这个class添加到MessageHandler里面。


namespace client {

	class MsgHandler : public CefMessageRouterBrowserSide::Handler {
	public:
		typedef cef_termination_status_t TerminationStatus;
		MsgHandler() { CEF_REQUIRE_UI_THREAD(); }

		// Called due to cefQuery execution.
		virtual bool OnQuery(CefRefPtr<CefBrowser> browser,
			CefRefPtr<CefFrame> frame,
			int64 query_id,
			const CefString& request,
			bool persistent,
			CefRefPtr<Callback> callback) OVERRIDE
		{
			const std::string& request_str = request;

			if (request_str.size() == 0)
			{
				return false;
			}
			//...
			callback->Success(CefString());
			return true;

		}
	};

}

有很多人不知道要在哪里添加MessageHandler,打开client_handler.cc,搜索“ClientHandler::OnAfterCreated”。


void ClientHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
  CEF_REQUIRE_UI_THREAD();

  browser_count_++;
  if (!message_router_) {
	  // Create the browser-side router for query handling.
	  CefMessageRouterConfig config;
	  message_router_ = CefMessageRouterBrowserSide::Create(config);
    // Register handlers with the router.
    test_runner::CreateMessageHandlers(message_handler_set_);
	
	MsgHandler *msgHandler = new MsgHandler();
	message_handler_set_.insert(msgHandler);

	MessageHandlerSet::const_iterator it = message_handler_set_.begin();
	for (; it != message_handler_set_.end(); ++it)
	{
		message_router_->AddHandler(*(it), false);
	}

  }
  // Disable mouse cursor change if requested via the command-line flag.
  if (mouse_cursor_change_disabled_)
    browser->GetHost()->SetMouseCursorChangeDisabled(true);

  if (browser->GetHost()->GetExtension()) {
    // Browsers hosting extension apps should auto-resize.
    browser->GetHost()->SetAutoResizeEnabled(true, CefSize(20, 20),
                                             CefSize(1000, 1000));

    CefRefPtr<CefExtension> extension = browser->GetHost()->GetExtension();
    if (extension_util::IsInternalExtension(extension->GetPath())) {
      // Register the internal handler for extension resources.
      extension_util::AddInternalExtensionToResourceManager(extension,
                                                            resource_manager_);
    }
  }

  NotifyBrowserCreated(browser);
}

这些可能在其他地方也可以搜到类似的做法,但是,如果subProcess.exe没有处理好的话,也不可能收到消息的。在前面我已经发出来了,CefExecuteProcess必须要有app这个参数。重新贴一下代码:


	int SubProcess(HINSTANCE hInstance, int nCmdShow)
	{
		CefMainArgs main_args(hInstance);
		// Parse command-line arguments.
		CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();
		command_line->InitFromString(::GetCommandLineW());

		CefRefPtr<CefApp> app;
		ClientApp::ProcessType process_type = ClientApp::GetProcessType(command_line);
		//ClientApp::ProcessType process_type = ClientApp::BrowserProcess;
		//ClientApp::ProcessType process_type = ClientApp::RendererProcess;
		if (process_type == ClientApp::BrowserProcess)
			app = new ClientAppBrowser();
		else if (process_type == ClientApp::RendererProcess)
			app = new ClientAppRenderer();
		else if (process_type == ClientApp::OtherProcess)
			app = new ClientAppOther();
		return CefExecuteProcess(main_args, app, NULL);
	}

我在这个坑踏进了很久没出来,苦涩啊。。。

cef中c++和javascript数据交互的几种方法 基础知识 cef中有两种进程,render进程和browser进程。 render进程 render进程负责显示web页面,运行javascript代码。 v8引擎的初始化是在render进程中调用的,所以你的javascript代码是在render进程中执行的。 即使你在browser进程中调用 frame->ExecuteJavaScript() 你也要清楚,代码是发送到rend... 阅读详情

相关推荐

菜鸟与 cef 的邂逅之旅(三):Cef3 中 C++ 与 JavaScript 的互相调用

菜鸟与 cef 的邂逅之旅(三):Cef3 中 C++ 与 JavaScript 的互相调用 一、引言我们要实现一个强大的浏览器控件,必须要能够实现 C++ 与 JavsScript 的互相调用。于是,在我研究了:菜鸟与 cef 的邂逅之旅(一):cef 源码获取与编译 菜鸟与 cef 的邂逅之旅(二):Soui 中接入 Cef3 的实现这些主题之后,研究 Cef3 中 C++ 与 JavaScript 之间的

(ÒωÓױ) 1万+

cef3增加外壳程序

 概述 本程序基于CEF3开发,本质上是一个扩充了功能的浏览器。 功能扩充利用了CEF3提供的同步异步js函数扩充接口。 异步扩充接口 CEF3为异步js调用提供了一个专用接口window.cefQuery(…)。其调用形式如下: 其中“request”传输参数。需要注意的是所有参数被按照字符串连接在一起,并以“\n”分割。 所有自定义异步调用的入口均是该函数。下面说明如

cqltbe131421的博客 2743

菜鸟与 cef 的邂逅之旅(四):Soui 离屏渲染封装 Cef3 细节分析

一、引言最近因为项目组涉及到了 Cef3 的任务,临时来学习,经过了两个周的时间,加上各位大神和 Demo 的帮助,已经有了一点点感悟,希望在自己尚未遗忘之际,详细的记录下来,以飨各位同样在 Cef3 初学之际迷惘的人。这篇博客的背景,是我已经成功编译运行了蓝先生(Soui 界面群里面的一位对我帮助很大的大神)的 Demo,这个 Demo 里已经集成了这篇博客里所有要讲述的内容。但是我并不满足于现成

(ÒωÓױ) 1万+

cef中js与C++交互

cefquery方式交互 前端使用 window.cefQuery({ request: 'checkProductID', 请求名作为标识 persistent: false, onSuccess: this.checkLicenseSucess, onFailure: this.checkLicenseFailure }); cef端处理:OnQuery if (message_name == kMessageCheckLi

perfectMutation的博客 1435

C++与js的相互调用方式(cef_message_router)

CEF 之 C++与JS的调用

sunny_orc的专栏 2036

libCEF中C++与JavaScript的交互调用

前言 前一篇文章介绍过CEF在WIN32程序中嵌入chrome内核浏览器的例子:http://blog.youkuaiyun.com/mfcing/article/details/43973377 这里介绍的是嵌入浏览器后,网页的JS脚本函数与C++代码的交互,这个很多地方都用得到。比如:音乐播放器里网页上的播放,客户端资源中心里的资源下载…… JS调用C++函数 首先需要重写CefRende

https://github.com/JelinYao 3万+

CEF中JavaScript与C++交互

在CEF里,JS和Native(C/C++)代码可以很方便的交互,我实现了一个简单的交互示例。

安晓辉生涯——聚焦程序员的职业规划与成长 4万+

Cef3中js与C++交互(一)——窗口绑定

看了网上的一些博客和教程,还是有点迷糊。 再回头看官方文档https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md 还自己用例子来验证吧。 Qt工程中的目录结构,VS2017编译器(Qt用的是Qt5.14.2) 这里的文件都和之前的一样,我这里就不再赘述了,我会放到百度云上,大家下载下来看就一目了然了。 simple_app.h #pragma once #include "include/cef_app.h"

斧冰 2487

cef C++ 与js交互

JS 绑定官方介绍:https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration 1.cefSample CEF中C++与JS交互,cef3 win32客户端 本项目配套博客网址:https://blog.youkuaiyun.com/leapmotion/article/details/80853508?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-1.

Greless的后花园 873

CEF3和本地程序交互机制

CEF中一个页面的框架如下图所示:     CefBrowser:一个普通的浏览器页面(HTML) CefFrame:每一个页面都由至少一个frame组成,最顶层的为mainframe context:JS执行环境,每个frame都有自己独立的context,CEF中使用V8JavaScriptEngine解析和执行JS代码     后端和前端的通信分为两个部分: 一.C++

oudizuo的专栏 1万+

wxWidgets嵌入CEF3,并实现JavaScript调用C++代码

由于项目选用了wxWidgets做图形界面,wx既然能和QT相提并论,自然是他的跨平台做的也相当的优秀,唯一的美中不足是资料太少。 好了废话不多说,言归正传。 我使用wxWidgets版本是3.0.2,在windows vs2013下做的项目,接下来是要移植到Mac 和Linux系统下的。 wx嵌入CEF3是参考了GitHub上的一个开源项目,也是wx官方论坛里的大神提供的,连

Ellan_BM的博客 2526

CEF JS与browser进程间的异步通信

基于CEF开发时经常需要在JS和C++代码间通信,我们在CEF中JavaScript与C++交互中讨论了常见的交互方式,不过都是在Renderer进程中,这次来看看如何在JS和Browser进程间通信

安晓辉生涯——聚焦程序员的职业规划与成长 1万+

CEF系列之 如何使用前端JS 向 C++传递信息

需求 有这么个需求: CEF浏览器上,点击一个按钮,要求弹出一个原生对话框,在这个原生对话框上,加载CEF浏览器传来的网址。 这个就涉及到了JS给C++传送信息,也就是JS调用C++功能。 JS写法 NimCefWebInstance.call('CEF_SendToCppExerciseInfo',{url},(error,result) 其中,NimCe...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 1809

CEF:C++和JS交互

CEF 中的JavaScript CEF 利用 V8 JS 引擎来实现 JS。 浏览器中的每一个 frame 都有自己的 JS 上下文,JS 只能在该上下文中执行。 JS 只能在渲染进程中的 TID_RENDERER 线程中执行。 有关 JS 回调的接口都包含在 CefRenderProcessHandler 中,因此我们要实现这个接口来对 JS 进行扩展。这个接口一般由 CefApp 实现。 ...

CAir2的专栏 7516

C++与JavaScript在MFC应用中交互的CEF集成指南

MFC(Microsoft Foundation Classes)是微软推出的一套用以简化Windows应用程序开发的C++类库。它封装了大部分Windows API,提供了一套面向对象的框架,用于简化对Windows API的调用和处理,从而允许开发者集中精力于业务逻辑的实现上。MFC还包含了诸多已经实现了的组件和控件,如对话框、按钮、列表控件等,使得开发者可以轻松创建用户界面。

weixin_42610671的博客 1108

CentOS7环境下搭建 rsyslog 日志服务器,rsyslog+loganalyzer

1.系统环境部署 ip hostname 192.168.200.182 web 192.168.200.184 rsyslog-mysql 关闭防火墙、selinux、下载epel源 [root@web ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/f

sehn_的博客 3754

Duilib封装CEF_85.3.9实现与JS交互:C++与JavaScript的桥梁

Duilib封装CEF_85.3.9实现与JS交互:C++与JavaScript的桥梁 去发现同类优质开源项目:https://gitcode.com/ 在软件开发领域,跨语言交互一直是工程师们关注的焦点。本文将为您介绍一个开源项目——Duilib封装CEF_85.3.9实现与JS交互,它为C++与JavaScript之间的交互提供了一个高效、便捷的解决方案。 项目介绍 Duilib封装CEF_8...

gitblog_06737的博客 762

STM32F103+LAN9252实战:从站代码迁移中的5个硬件坑与解决方案

本文分享了将EtherCAT从站代码从STM32F767迁移至STM32F103平台时,搭配LAN9252遇到的五个典型硬件问题及解决方案。核心挑战包括时钟源不匹配、FSMC时序配置、中断映射错误、片选资源不足以及Flash烧录异常。文章通过实战经验,强调了硬件差异对代码迁移的关键影响,并提供了具体的调试思路与配置方法。

p5l2m9n4o6q的博客 697

CEF C++与JS 交互 全部方式整理

由于工作需要,公司开辟一个新项目需要用到CEF框架,由此去认识了一段时间的CEF框架,记录下一些心得。本文主要介绍CEF框架内,C++与JS的几种交流方式,翻阅了大量资料应该是较为全面了的。

weixin_45068267的博客 1232

利用Python脚本在ADS2024 Update2中动态绘制与验证LPDDR5眼图模板

本文详细介绍了如何在ADS2024 Update2中,利用Python脚本动态绘制与验证LPDDR5眼图模板。通过调用DDS Python接口,工程师可在仿真后无需重新运行,即可灵活添加、修改矩形或六边形眼图模板,并实现批量自动化处理,从而极大提升高速信号(如LPDDR5)的调试与验证效率。

raspberrypi5的博客 603

逆向实战:从x-mini签名到RPC调用,Frida动态分析小红书加密协议

本文通过实战案例,详细拆解了小红书App的加密协议逆向分析过程。从识别x-mini签名等关键参数入手,结合静态分析与Frida动态Hook技术,追踪到核心的RPC调用入口,并最终封装成可独立调用的RPC函数,为安全研究和协议理解提供了完整的技术路径。

moss5的博客 1028

CEF3开发者系列之JS与C++交互之二

CEF3开发者系列之JS与C++交互之二 本文翻译自JavaScriptIntegration(https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration)。本人在CEF3方面的功力尚浅,翻译中有不当之处,请赐教。对于一些没有太大把握的地方,同时给出了英文和翻译。如不想看本人的拙作,亦可看幻灰龙的JavaScript和Cpp交互示例(Custom Implementation) 简介 执行JavaScript 窗体绑定.

重庆一小兵--关注教育、机器视觉、商务智能、数据分析 568

【专栏目录】

🌟 深度学习工程师的终极武器库!本专栏深度解析近3年CV领域最前沿的YoloV8改进方案,每一种方法都经过实战验证,性能显著提升!🌟。

m0_47867638的博客 1万+
上一篇: RegEnumValueW返回值234,什么情况?
下一篇: 一步步CEF(4)之修改窗口大小
狼风123
博客等级 码龄19年 1058粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值