精华内容
下载资源
问答
  • 主要介绍了使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 直接在Nuget中安装CefSharp84.4.1,winform/wpf安装84.4.10版都可以,并不影响,支持Mp4的关键文件是libcef.dll,安装后直接用libcef.dll文件替换就可以
  • Qt使用Libcef

    热门讨论 2016-11-03 11:22:23
    Qt使用Libcef访问网页,已经封装好了访问类QCefWebView
  • cefsharp88.2.9_h264_x86_x64_完美支持mp4视频 替换88.2.9生成的 libcef.dll文件
  • 一个小巧、轻量的浏览器内核,用来取代wke和libcef
  • libcef源码(分支3202)源码+编译中遇到的问题及解决方法
  • 在win32程序中使用Libcef嵌入浏览器控件,libcef基于最新chrome内核,无IE兼容性问题,你值得拥有。源码中包含了cef的使用:初始化、回调设置、JS与C++交互等,适合初学者学习。(VS2008工程)
  • 网上只找到一个 2012版本的 这是我生产的VS2015版本
  • libcef_dll_wrapper.lib

    2018-01-13 21:20:53
    windows32,开发Cef必须的核心库,版本:3.3202.1693。
  • 之前的cef vs2005编译 发下少了libcef dll wrapper工程,特此补上lib文件,自己在cefclient.cpp里补上#pragma comment( lib, "libcef_dll_wrapper.lib")即可
  • CEF74.1.19+gb62bacf+chromium-74.0.3729.157 libcef.dll 64位 支持h.264 mp4 mp3
  • libcef在使用的时候,需要自己编译好libcef_dll_wrapper.dll 这里有编译好的libcef库,编译环境为vs2017、win10、x64,包含release和debug库,方便大家使用。
  • libcef3+MFC最简单的demo

    2019-04-08 11:37:13
    较为简单的libcefdemo,其中包含了js如何调用c++函数,libcef版本号3683.1920
  • libcef.dll

    2013-09-30 15:11:48
    libcef.dll
  • libcef和js交互

    2021-07-10 16:08:30
    1.下载libcef_wrapper工程: https://cef-builds.spotifycdn.com/index.html#windows32 这是别人编译好的工程,libcef只提供了C语言api,lib_warpper是一个对C接口进行包装的工程。

    1.下载libcef_wrapper工程:

            https://cef-builds.spotifycdn.com/index.html#windows32

            修改里面的cefsimple工程和js通信

    2.文档:

            https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration

    1.实现V8handler进行交互

            1.添加html文件:

          cefsimple工程的默认url是google.com,把url改为我们的本地的html文件如下:

    <body>
        <title>V8Test</title>
        <div>
            hello v8
        </div>
        <div>
            <input type="button" value="test" onclick="onClick()" />
        </div>
        <script language="JavaScript">
            alert(window.myfunc()); // Shows an alert box with "My Value!"
        </script>
    </body>

             2.实现v8 handler:

            cef使用v8和js通信,所以我们需要继承CefV8Handler,并且实现Execute函数,因为js调用我们注册的对象或者函数会进入Execute函数,上面js调用了myfunc函数,现在我们需要在Execute处理这个调用:

    bool V8Handler::Execute(const CefString& name, CefRefPtr<CefV8Value> object,
    	const CefV8ValueList& arguments, CefRefPtr<CefV8Value>& retval,
    	CefString& exception)
    {
    	if (name == "myfunc") {
    		// Return my string value.
    		retval = CefV8Value::CreateString("My Value!");
    		return true;
    	}
    
    	// Function does not exist.
    	return false;
    }

          直接返回一个字符串的值。

              2.实现render handler:

              在cefsimple_win.cc文件中,渲染进程是没有handler的,默认传了nullptr,所以我们需要传递一个rendler handler:

      // CEF applications have multiple sub-processes (render, plugin, GPU, etc)
      // that share the same executable. This function checks the command-line and,
      // if this is a sub-process, executes the appropriate logic.
      CefRefPtr<CefApp>renderHandler(new RenderHandler);
      int exit_code = CefExecuteProcess(main_args, renderHandler.get(), sandbox_info);
      if (exit_code >= 0) {
        // The sub-process has completed so return here.
        return exit_code;
      }

            rendler handler主要继承:CefApp、CefRenderProcessHandler、CefLifeSpanHandler这个三个类,然后我们需要override OnContextCreated这个函数,在里面注册对象并且绑定到js:

    void RenderHandler::OnContextCreated(CefRefPtr<CefBrowser> browser,
    	CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
    {
    	CefRefPtr<CefV8Value> object = context->GetGlobal();
    	CefRefPtr<CefV8Handler> handler = new V8Handler();
    	CefRefPtr<CefV8Value> func = CefV8Value::CreateFunction("myfunc", handler);
    	object->SetValue("myfunc", func, V8_PROPERTY_ATTRIBUTE_NONE);
    }

            3.cpp调用调用js:       

            最直接的方式就是调用CefFrame::ExecuteJavaScript(),在browser创建完成后,可以通过browser获取frame:

    void RenderHandler::OnBrowserCreated(CefRefPtr<CefBrowser> browser,
    	CefRefPtr<CefDictionaryValue> extra_info)
    {
    	CefRefPtr<CefFrame> frame = browser->GetMainFrame();
    	frame->ExecuteJavaScript("alert(\"browser created\")", frame->GetURL(), 0);
    }

            4.效果:

    2.使用message router和js交互

            1.wrapper工程实现了message router,可以直接使用,message router默认在js的window对象中添加cefQuery方法,所以在js中直接调用:

    <body>
        <title>V8Test</title>
        <div>
            hello v8
        </div>
        <div>
            <input type="button" value="test" onclick="onClick()" />
        </div>
        <script language="JavaScript">
            alert(window.myfunc()); // Shows an alert box with "My Value!"
            function onClick(){
                window.cefQuery(
                    {
                        request: 'testfromjs',
                        persistent: false,
                        onSuccess: function(response) { alert(response); },
                        onFailure: function(error_code, error_message) {} 
                    }
                );
            }
        </script>
    </body>

             2.渲染进程的router:

            在渲染进程中,创建一个CefMessageRouterRendererSide类型的成员变量,用于处理render handler的路由:

    RenderHandler::RenderHandler()
    {
    	CefMessageRouterConfig config;
    	config.js_query_function = "cefQuery";  //可以自由配置函数名字,需要和browser进程的一致
    	config.js_cancel_function = "cefQueryCancel";
    	m_renderMsgRouter = CefMessageRouterRendererSide::Create(config);
    }

            然后把rendler handler中的OnContextCreated、OnContextReleased、OnProcessMessageReceived都交给router:

    void RenderHandler::OnContextCreated(CefRefPtr<CefBrowser> browser,
    	CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
    {
    	m_renderMsgRouter->OnContextCreated(browser, frame, context);
    }
    
    void RenderHandler::OnContextReleased(CefRefPtr<CefBrowser> browser,
    	CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
    {
    	m_renderMsgRouter->OnContextReleased(browser, frame, context);
    }
    
    bool RenderHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
    	CefRefPtr<CefFrame> frame, CefProcessId source_process,
    	CefRefPtr<CefProcessMessage> message)
    {
    	return m_renderMsgRouter->OnProcessMessageReceived(browser, frame, source_process, message);
    }

            如果查看CefMessageRouterRendererSide::OnContextCreated里面的实现,可以看到其实也是用了上面的绑定方式,只是他帮我们实现了v8 handler,并且通过IPC发送到了browser进程:

            

            3.browser进程的router:

            browser进程也创建一个CefMessageRouterBrowserSide的成员变量,然后进行处理message:

      CefMessageRouterConfig config;
      config.js_query_function = "cefQuery";  //和render handler中的名字一致
      config.js_cancel_function = "cefQueryCancel";
      m_browserMsgRouter = CefMessageRouterBrowserSide::Create(config);
      m_browserMsgRouter->AddHandler(this,false);

            把handler的OnProcessMessageReceived交给router:

    bool SimpleHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
        CefRefPtr<CefFrame> frame, CefProcessId source_process,
        CefRefPtr<CefProcessMessage> message)
    {
        return m_browserMsgRouter->OnProcessMessageReceived(browser, frame, source_process, message);
    }

            browser handler继承CefMessageRouterBrowserSide::Handler,并且实现OnQuery函数,因为消息会被路由到Handler的OnQuery函数:

    bool SimpleHandler::OnQuery(CefRefPtr<CefBrowser> browser,
        CefRefPtr<CefFrame> frame, int64 query_id, const CefString& request,
        bool persistent, CefRefPtr<Callback> callback)
    {
        if (request == "testfromjs")
        {
            callback->Success("testfromcpp");
            return true;
        }
        return false;
    }

            CefMessageRouterBrowserSide::OnProcessMessageReceived函数其实就是接收到IPC消息,分发给了AddHandler保存的所有handler的OnQuery函数。

            4.效果:

            

    展开全文
  • libcef_dll_wrapper.lib VS2015 生成 Jcef内嵌浏览器
  • 所需的链接库包括:comctl32.lib、shlwapi.lib、rcprt4.lib、libcef_dll_wrapper.lib、libcef.lib、cef_sandbox.lib。请注意,cef_sandbox.lib(沙箱支持所需)是当前使用 Visual Studio 2015 Update 3 构建的静态...

      以下内容翻译至官方网站。

    1.介绍

      本教程解释了如何使用 CEF3 创建一个简单的应用程序。它引用了cefsimple 示例项目。如需完整的 CEF3 使用信息,请访问GeneralUsage Wiki 页面。

    2.入门

      CEF 提供了一个示例项目,可让您轻松开始 CEF 开发。只需浏览到cef-project网站并按照分步说明进行操作。本教程链接的源文件适用于当前的 CEF3 主分支,可能与 cef-project 下载的版本略有不同。

    3.加载自定义 URL

      cefsimple 应用程序默认加载 zhiliaos.com,但您可以将其更改为加载自定义 URL。加载不同 URL 的最简单方法是通过命令行。这个项目是源代码项目下的展示项目:

    # 加载本地文件“c:\example\example.html” 
    cefsimple.exe --url=file://c:/example/example.html
    

      您还可以编辑cefsimple/simple_app.cc 中的源代码并重新编译应用程序以默认加载您的自定义 URL。

    // 加载本地文件“c:\example\example.html” 
    ... 
    if (url.empty()) 
      url = "file://c:/example/example.html";

    4.应用模块

      所有 CEF 应用程序都具有以下主要组件:

    1. CEF 动态库(Windows 上的 libcef.dll,Linux 上的 libcef.so,OS X 上的“Chromium Embedded Framework.framework”)。
    2. 支持文件(*.pak 和 *.bin 二进制 blob 等)。
    3. 资源(用于内置功能、字符串等的 html/js/css)。
    4. 客户端可执行文件(本示例中为 cefsimple)。

      CEF 动态库、支持文件和资源对于每个基于 CEF 的应用程序都是相同的。它们包含在二进制分发版的 Debug/Release 或 Resources 目录中。请参阅二进制分发版中包含的 README.txt 文件,详细了解哪些文件是必需的,哪些可以安全地省略。有关每个平台上所需应用程序布局的详细说明,请参见下文。

      以下列表总结了本教程中最重要的模块信息:

    • CEF 使用多个进程。主要的应用程序进程称为“浏览器”进程。将为渲染器、插件、GPU 等创建子进程。
    • 在 Windows 和 Linux 上,相同的可执行文件可用于主进程和子进程。在 OS X 上,您需要为子进程创建单独的可执行文件和应用程序包。
    • CEF 中的大多数进程都有多个线程。CEF 提供了用于在这些不同线程之间发布任务的函数和接口。
    • 某些回调和函数可能仅用于特定进程或特定线程。在第一次开始使用新的回调或函数之前,请务必阅读 API 标头中的源代码注释。

    5.源代码

      cefsimple 应用程序初始化 CEF 并创建一个弹出式浏览器窗口。当所有浏览器窗口都关闭时,应用程序终止。程序流程如下:

    1. 操作系统执行浏览器进程入口点函数(main 或 wWinMain)。
    2. 入口点函数:创建处理进程级回调的 SimpleApp 实例。初始化 CEF 并运行 CEF 消息循环
    3. 初始化后,CEF 调用 SimpleApp::OnContextInitialized()。这种方法:创建 SimpleHandler 的单例实例。使用 CefBrowserHost::CreateBrowser() 创建浏览器窗口。
    4. 所有浏览器共享 SimpleHandler 实例,该实例负责自定义浏览器行为和处理与浏览器相关的回调(生命周期、加载状态、标题显示等)。
    5. 当浏览器窗口关闭时,调用 SimpleHandler::OnBeforeClose()。当所有浏览器窗口都关闭时, OnBeforeClose 实现会退出 CEF 消息循环以退出应用程序。
      您的二进制发行版可能包含以下文件的较新版本。但是,一般概念保持不变。

    6.入口点函数

      执行开始于浏览器进程入口点函数。该函数负责初始化 CEF 和任何与操作系统相关的对象。例如,它在 Linux 上安装 X11 错误处理程序并在 OS X 上分配必要的 Cocoa 对象。OS X 有一个单独的入口点函数用于辅助进程。

    平台实现
    Windows平台实现cefsimple/cefsimple_win.cc
    Linux平台实现cefsimple/cefsimple_linux.cc
    Mac OS X 平台实现对于浏览器进程:cefsimple/cefsimple_mac.mm对于子进程:cefsimple/process_helper_mac.cc

    7.简单应用

      SimpleApp 负责处理进程级回调。它公开了一些由多个进程共享的接口/方法,以及一些仅在特定进程中调用的接口/方法。例如,CefBrowserProcessHandler 接口仅在浏览器进程中调用。有一个单独的 CefRenderProcessHandler 接口(在这个例子中没有显示),它只在渲染过程中被调用。注意 GetBrowserProcessHandler() 必须返回 |this| 因为 SimpleApp 实现了 CefApp 和 CefBrowserProcessHandler。有关CefApp 和相关接口的其他信息,请参阅GeneralUsage Wiki 页面或 API 头文件。共享实现:cefsimple/simple_app.h、cefsimple/simple_app.cc

    8.简单处理程序

      SimpleHandler 负责处理浏览器级别的回调。这些回调在浏览器进程中执行。在此示例中,我们对所有浏览器使用相同的 CefClient 实例,但您的应用程序可以根据需要使用不同的 CefClient 实例。有关CefClient 和相关接口的其他信息,请参阅GeneralUsage Wiki 页面或 API 头文件。

    1. 共享实现:cefsimple/simple_handler.h、cefsimple/simple_handler.cc
    2. Windows平台实现:cefsimple/simple_handler_win.cc
    3. Linux平台实现:cefsimple/simple_handler_linux.cc
    4. Mac OS X 平台实现:cefsimple/simple_handler_mac.mm

    9.构建步骤

      构建步骤因平台而异。探索包含在二进制发行版中的 CMake 文件,以全面了解所有必需的步骤。所有平台通用的构建步骤一般可以总结如下:

    1. 编译 libcef_dll_wrapper 静态库。
    2. 编译应用程序源代码文件。链接 libcef 动态库和 libcef_dll_wrapper 静态库。
    3. 将库和资源复制到输出目录。

    10.Windows 构建步骤

    1. 编译 libcef_dll_wrapper 静态库。
    2. 编译/链接 cefsimple.exe。
      • 所需的源代码文件包括:cefsimple_win.cc、simple_app.cc、simple_handler.cc、simple_handler_win.cc。
      • 所需的链接库包括:comctl32.lib、shlwapi.lib、rcprt4.lib、libcef_dll_wrapper.lib、libcef.lib、cef_sandbox.lib。请注意,cef_sandbox.lib(沙箱支持所需)是当前使用 Visual Studio 2015 Update 3 构建的静态库,它可能无法与其他 Visual Studio 版本一起编译。有关如何禁用沙箱支持,请参阅 cefsimple_win.cc 中的注释。
      • 资源文件是cefsimple.rc。
      • 清单文件是cefsimple.exe.manifest 和compatibility.manifest。
    3. 将所有文件从 Resources 目录复制到输出目录。
    4. 将所有文件从 Debug/Release 目录复制到输出目录。

    11.Linux 构建步骤

    1. 编译 libcef_dll_wrapper 静态库。
    2. 编译/链接 cefsimple。
      • 所需的源代码文件包括:cefsimple_linux.cc、simple_app.cc、simple_handler.cc、simple_handler_linux.cc。
      • 所需的链接库包括:libcef_dll_wrapper.a、libcef.so 和依赖项(在构建时使用“pkg-config”工具确定)。
      • 配置 rpath 以在当前目录中查找 libcef.so(“-Wl,-rpath,.”)或使用 LD_LIBRARY_PATH 环境变量。
    3. 将所有文件从 Resources 目录复制到输出目录。
    4. 将所有文件从 Debug/Release 目录复制到输出目录。
      在 chrome-sandbox 可执行文件上设置 SUID 权限以支持沙箱。有关必要命令,请参阅二进制分发构建输出。

    12.Mac OS X 构建步骤

    1. 编译 libcef_dll_wrapper 静态库。
    2. 编译/链接/打包“cefsimple Helper”应用程序。
      • 所需的源代码文件包括:process_helper_mac.cc。
      • 所需的链接框架包括:AppKit.framework。
      • 应用程序包配置通过“cefsimple/mac/helper-Info.plist”提供。
      • 按此处所述加载 CEF 框架。
    3. 编译/链接/打包“cefsimple”应用程序。
      • 所需的源代码文件包括:cefsimple_mac.mm、simple_app.cc、simple_handler.cc、simple_handler_mac.mm。
      • 所需的链接框架包括:AppKit.framework。
      • 应用程序包配置通过“cefsimple/mac/Info.plist”提供。
      • 按此处所述加载 CEF 框架。
    4. 在 cefsimple.app 包中创建一个 Contents/Frameworks 目录。将以下文件复制到该目录:“cefsimple Helper.app”、“Chromium Embedded Framework.framework”。

      合理的脚本代码可以有效的提高工作效率,减少重复劳动。


      欢迎光临知了软件开发网络平台,本公司定制开发各类软件,主要方向为桌面专业软件开发、插件定制开发、微信小程序(各类小程序)、网站开发和App开发,桌面软件主要包括文字图形识别类软件,信息管理类软件,3D打印类软件,视频类软件以及其它涉及专业的各类图形图像处理软件。插件包含AE插件,AI插件,PS插件,PDF插件,3DMAX插件以及Word,Excel等Office插件开发。详情请咨询,微信QQ:312117271,手机:18928899728,邮箱: anjingzhi_sea@163.com.
    公司网址:http://www.zhiliaos.com

    展开全文
  • libcef_dll_wrapper.lib windows32版本,包含Release和Debug版本,采用VS2010编译
  • libcef动态链接库注册

    2018-02-06 16:40:44
    主要用于系统与搜狗输入法报错时使用,因此可作为参考进行处理
  • 打开sln,修改libcef_dll_wrapper工程属性: C/C++ -> General -> Treat Warnings As Errors: No C/C++ -> Code Generation -> Runtime Library: MD
  • duilib&Libcef 多标签浏览器

    热门讨论 2015-07-10 18:52:53
    采用duilib作为界面库,libcef作为内核,开发的一款多标签多进程浏览器。
  • libCEF 字符串的总结
  • 一起学libcef--一个应用libcef的简单例子(windows程序)
                           

    之前博客《一起学libcef–搭建自己的libcef运行环境(Win32程序,错误C2220解决方案)》讲述了如何在win32程序中搭建libcef的环境,今天就通过一个简单的例子,在windows程序中使用libcef。

    现在再重新写一下如何搞?直接在源代码上搞起!
    1 打开源码cefclient解决方案
    2 确保cefclient例子可以完美运行
    3 在cefclient中,除了util.h之外,全部移除
    4 manifests 和 resources文件也可以移除(you must remember to remove the additional manifest files from the Visual Studio project file.)
    5 libcef_dll_wrapper 是静态链接,所以我们需要更改项目为动态链接。

    接下来就要干我们的事儿了:
    1 创建一个自己的头文件ExampleCefApp.h, 在这里新建一个类,继承自CefApp:
    CefApp 负责所有的工作, 但是这是一个抽象类,需要计数实现
    这样, 我们继承自CefApp创建了一个傀儡类,实际上也什么都没做

    #include "include/cef_app.h"class ExampleCefApp : public CefApp{   public:      ExampleCefApp ()      {      }      virtual ~ExampleCefApp ()      {      }   private:      IMPLEMENT_REFCOUNTING (ExampleCefApp);};
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2创建一个ExampleCefHandler.h文件,这里面实现一个类继承自所有的event handling classes。

    #pragma once#include "include/cef_client.h"#include "cefclient/util.h"class ExampleCefHandler : public CefClient,                          public CefContextMenuHandler,                          public CefDisplayHandler,                          public CefDownloadHandler,                          public CefDragHandler,                          public CefGeolocationHandler,                          public CefKeyboardHandler,                          public CefLifeSpanHandler,                          public CefLoadHandler,                          public CefRequestHandler{ public:      ExampleCefHandler();      virtual ~ExampleCefHandler();      CefRefPtr<CefBrowser> GetBrowser();#pragma region CefClient      // since we are letting the base implementations handle all of the heavy lifting,      // these functions just return the this pointer      virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler () OVERRIDE;      virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler () OVERRIDE;      virtual CefRefPtr<CefDownloadHandler> GetDownloadHandler () OVERRIDE;      virtual CefRefPtr<CefDragHandler> GetDragHandler () OVERRIDE;      virtual CefRefPtr<CefGeolocationHandler> GetGeolocationHandler () OVERRIDE;      virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler () OVERRIDE;      virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler () OVERRIDE;      virtual CefRefPtr<CefLoadHandler> GetLoadHandler () OVERRIDE;      virtual CefRefPtr<CefRequestHandler> GetRequestHandler () OVERRIDE;#pragma endregion // CefClient#pragma region CefDownloadHandler      // 这个函数为虚函数,我们必须实现它。但是我们什么也没做,所以下载文件的操作不会工作      virtual void OnBeforeDownload (CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item, const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback);#pragma endregion // CefDownloadHandler #pragma region CefLifeSpanHandler      // 缓存一个指向browser的引用      virtual void OnAfterCreated (CefRefPtr<CefBrowser> browser) OVERRIDE;      // 释放browser引用      virtual void OnBeforeClose (CefRefPtr<CefBrowser> browser) OVERRIDE;#pragma endregion // CefLifeSpanHandler   protected:      // the browser reference      CefRefPtr<CefBrowser> browser;      // Include the default reference counting implementation.      IMPLEMENT_REFCOUNTING (ExampleCefHandler);      // Include the default locking implementation.      IMPLEMENT_LOCKING (ExampleCefHandler);};
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    3.创建一个源文件 ExampleCefHandler.cc:

    #include "cefclient/ExampleCefHandler.h"// defined in main.cpppextern void AppQuitMessageLoop ();ExampleCefHandler::ExampleCefHandler (){}ExampleCefHandler::~ExampleCefHandler (){}CefRefPtr<CefBrowser> ExampleCefHandler::GetBrowser (){   return browser;}CefRefPtr<CefContextMenuHandler> ExampleCefHandler::GetContextMenuHandler () {   return this;}CefRefPtr<CefDisplayHandler> ExampleCefHandler::GetDisplayHandler () {   return this;}CefRefPtr<CefDownloadHandler> ExampleCefHandler::GetDownloadHandler () {   return this;}CefRefPtr<CefDragHandler> ExampleCefHandler::GetDragHandler () {   return this;}CefRefPtr<CefGeolocationHandler> ExampleCefHandler::GetGeolocationHandler (){   return this;}CefRefPtr<CefKeyboardHandler> ExampleCefHandler::GetKeyboardHandler () {   return this;}CefRefPtr<CefLifeSpanHandler> ExampleCefHandler::GetLifeSpanHandler () {   return this;}CefRefPtr<CefLoadHandler> ExampleCefHandler::GetLoadHandler () {   return this;}CefRefPtr<CefRequestHandler> ExampleCefHandler::GetRequestHandler () {   return this;}void ExampleCefHandler::OnBeforeDownload (CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item, const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback){   UNREFERENCED_PARAMETER (browser);   UNREFERENCED_PARAMETER (download_item);   callback->Continue (suggested_name, true);}void ExampleCefHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {  REQUIRE_UI_THREAD();  AutoLock lock_scope (this);  this->browser = browser;  CefLifeSpanHandler::OnAfterCreated (browser);}void ExampleCefHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {  REQUIRE_UI_THREAD();  AutoLock lock_scope (this);  browser = NULL;  AppQuitMessageLoop();  CefLifeSpanHandler::OnBeforeClose (browser);}
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91

    4. 最后,创建一个主函数:

    #include "cefclient/ExampleCefApp.hpp"#include "cefclient/ExampleCefHandler.hpp"#include "cefclient/util.h"#include <windows.h>#define BROWSER_WINDOW_CLASS TEXT("BrowserWindowClass")#define INVALID_HWND (HWND)INVALID_HANDLE_VALUE#define MESSAGE_WINDOW_CLASS TEXT("MessageWindowClass")#define QUIT_CEF_EXAMPLE 0xABAD1DEAnamespace{   CefRefPtr<ExampleCefHandler> example_cef_handler;   HWND application_message_window_handle = INVALID_HWND;}LRESULT CALLBACK BrowserWindowWndProc (HWND, UINT, WPARAM, LPARAM);void CreateBrowserWindow (HINSTANCE instance_handle, int show_minimize_or_maximize){   WNDCLASSEX wcex = { 0 };   wcex.cbSize        = sizeof (wcex);   wcex.style         = CS_HREDRAW | CS_VREDRAW;   wcex.lpfnWndProc   = BrowserWindowWndProc;   wcex.hInstance     = instance_handle;   wcex.hCursor       = LoadCursor (NULL, IDC_ARROW);   wcex.hbrBackground = WHITE_BRUSH;   wcex.lpszClassName = BROWSER_WINDOW_CLASS;   RegisterClassEx (&wcex);   HWND window_handle (CreateWindow (BROWSER_WINDOW_CLASS, BROWSER_WINDOW_CLASS,    WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, 0,    CW_USEDEFAULT, 0, NULL, NULL, instance_handle, NULL));   ShowWindow (window_handle, show_minimize_or_maximize);   UpdateWindow (window_handle);}LRESULT CALLBACK MessageWindowWndProc (HWND, UINT, WPARAM, LPARAM);HWND CreateMessageWindow (HINSTANCE instance_handle){   WNDCLASSEX wcex    = {0};   wcex.cbSize        = sizeof (wcex);   wcex.lpfnWndProc   = MessageWindowWndProc;   wcex.hInstance     = instance_handle;   wcex.lpszClassName = MESSAGE_WINDOW_CLASS;   RegisterClassEx (&wcex);   return CreateWindow (MESSAGE_WINDOW_CLASS, 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, instance_handle, 0);}// Program entry point function.int APIENTRY wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){   UNREFERENCED_PARAMETER (hPrevInstance);   UNREFERENCED_PARAMETER (lpCmdLine);   int result (0);   CefMainArgs main_args (hInstance);   CefRefPtr<ExampleCefApp> app (new ExampleCefApp);   // CefExecuteProcess returns -1 for the host process   if (CefExecuteProcess(main_args, app.get()) == -1)   {      CefSettings settings;      settings.multi_threaded_message_loop = true;      CefInitialize (main_args, settings, app.get ());      CreateBrowserWindow (hInstance, nCmdShow);      application_message_window_handle = CreateMessageWindow (hInstance);      MSG msg;      while (GetMessage (&msg, NULL, 0, 0))      {         TranslateMessage (&msg);         DispatchMessage (&msg);      }      result = static_cast<int>(msg.wParam);      DestroyWindow (application_message_window_handle);      application_message_window_handle = INVALID_HWND;      // disabled due to https://code.google.com/p/chromiumembedded/issues/detail?id=755      // CefShutdown ();      UnregisterClass (BROWSER_WINDOW_CLASS, hInstance);      UnregisterClass (MESSAGE_WINDOW_CLASS, hInstance);   }   return result;}LRESULT CALLBACK BrowserWindowWndProc (HWND window_handle, UINT message, WPARAM w_param, LPARAM l_param){   LRESULT result (0);   switch (message)   {      case WM_CREATE:         {            example_cef_handler = new ExampleCefHandler();            RECT rect = { 0 };            GetClientRect (window_handle, &rect);            CefWindowInfo info;            info.SetAsChild(window_handle, rect);            CefBrowserSettings settings;            CefBrowserHost::CreateBrowser(info, example_cef_handler.get(),             CefString ("http://www.google.com"), settings, NULL);         }         break;      case WM_SIZE:         {            // from the cefclient example, do not allow the window to be resized to 0x0 or the layout will break;            // also be aware that if the size gets too small, GPU acceleration disables            if ((w_param != SIZE_MINIMIZED)             && (example_cef_handler.get ())             && (example_cef_handler->GetBrowser ()))            {               CefWindowHandle hwnd (example_cef_handler->GetBrowser ()->GetHost ()->GetWindowHandle ());               if (hwnd)               {                  RECT rect = { 0 };                  GetClientRect (window_handle, &rect);                  HDWP hdwp = BeginDeferWindowPos (1);                  hdwp = DeferWindowPos (hdwp, hwnd, NULL,rect.left,                   rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);                  EndDeferWindowPos (hdwp);               }            }         }         break;      case WM_ERASEBKGND:         {            if ((example_cef_handler.get ())             && (example_cef_handler->GetBrowser ()))            {               CefWindowHandle hwnd (example_cef_handler->GetBrowser()->GetHost()->GetWindowHandle());               // from the cefclient example, don't erase the background                // if the browser window has been loaded to avoid flashing               result = hwnd ? 1 : DefWindowProc (window_handle, message, w_param, l_param);            }         }         break;      case WM_ENTERMENULOOP:         {            if (!w_param)            {               CefSetOSModalLoop (true);            }            result = DefWindowProc (window_handle, message, w_param, l_param);         }         break;      case WM_EXITMENULOOP:         {            if (!w_param)            {               CefSetOSModalLoop (false);            }            result = DefWindowProc (window_handle, message, w_param, l_param);         }         break;      case WM_DESTROY:         break;      default:         {            result = DefWindowProc (window_handle, message, w_param, l_param);         }         break;   }   return result;}LRESULT CALLBACK MessageWindowWndProc (HWND window_handle, UINT message, WPARAM w_param, LPARAM l_param){   LRESULT result (0);   switch (message)   {      case WM_COMMAND:         {            if (w_param == QUIT_CEF_EXAMPLE)            {               PostQuitMessage(0);            }         }         break;      default:         {            result = DefWindowProc (window_handle, message, w_param, l_param);         }         break;   }   return result;}void AppQuitMessageLoop (){   if (application_message_window_handle != INVALID_HWND)   {      PostMessage(application_message_window_handle, WM_COMMAND, QUIT_CEF_EXAMPLE, 0);   }}
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 网上的版本都太低了, 这是我用cef_binary_3.3239.1700.g385b2d4_windows32生产的VS2017版本
  • libcef

    2021-11-20 16:47:34
    mdd 嵌入普通窗口 嵌入duilib

    mdd
    嵌入普通窗口
    嵌入duilib

    展开全文
  • libcef.dll文件

    2021-08-11 12:02:41
    libcef.dll文件
  • Ubuntu20.04 libcef笔记

    2021-10-21 17:53:30
    零、 网站:CEF Automated Builds 下载:cef_binary_94.4.11+gc4d96f0+chromium-... 到这步,libcef的编译就算完成第一步了,后面集成开发还要仔细研读 cefclient cefsimple两个例子。Windows和Linux下cef有所差异。
  • vs2017下libcef配置

    2019-06-17 16:40:08
    3.编译 libcef_dll_wrapper 4.新建MFC对话框程序 5.运行程序 6.OK,好了 1.应用背景 随着 HTML5 的崛起和 IE 的淘汰,微软 Web Browser 控件越来越不合时宜,CEF (Chromium Embedded Framework) 越来越受欢迎。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,218
精华内容 487
关键字:

libcef