关于CEF

近期由于工作需要开始研究了Google的Chromium Embedded Framework(CEF),这是一个基于Google Chromium开源代码的项目,使用CEF可以很方便的在你自己程序中显示Web。简单的调研后发现,现在很多主流的客户端都使用了CEF来显示Web页面:网易云音乐、QQ、豌豆荚等(安装目录下可以找到libcef.dll)。

下载CEF

我使用的是3.1650.1562版本,CEF的发布版本在这里下载http://www.magpcss.net/cef_downloads/,页面下方的Download List表格中列出的是最新的发布版本(包括Windows、Linux、MacOS平台的32、64位版本)。我下载的是cef_binary_3.1650.1562_windows32,如果表格中的版本不是3.1650.1562,可以点击 older (deprecated) versions去找到。下载到本地之后解压缩到本地文件夹(我解压到了D:\cef_binary_3.1650.1562_windows32),打开文件夹后使用VS2010开打cefclient2010.sln,可以看到两个项目:cefclient、libcef_dll_wrapper。编译Debug版本的cefclient项目,确保可以编译通过,此时会在out目录下(我的目录是D:\cef_binary_3.1650.1562_windows32\out\Debug)生成相应的文件,运行cefclient.exe会显示出Google的页面。cefclient是如何使用cef的一个例子,具体可以参考项目代码。

将CEF嵌入到单文档程序中

在VS2010中,点击菜单项文件-》新建-》项目,选择MFC应用程序,项目名称命名为:CEFBrowser,项目位置根据你上面的解压缩位置而定,我的是D:\cef_binary_3.1650.1562_windows32,解决方案选择“添加到解决方案”,点击“确定”。如下图所示:
 
 
在“应用程序类型”中选择“单个文档”,MFC的使用选择“在静态库中使用MFC”,其余的选项默认,点击“完成”。可以看到在解决方案中新添加了CEFBrowser项目。
 
 
 
 
首先,将CEFBrowser项目设置为启动项目。右键点击CEFBrowser打开项目的“属性页”,点击“通用属性”-》框架和引用-》添加新引用,在弹出的“添加引用”对话框中选择“libcef_dll_wrapper”项目,点击“确定”。如下图所示:
 

 
点击“确定”退出属性页。libcef_dll_wrapper生成静态库libcef_dll_wrapper.lib,输出到cef_binary_3.1650.1562_windows32\out\Debug\lib目
录下,我们的程序需要加载这个静态库,当然你也可以在设置中按照目录包含它,或者在程序中使用#pragma comment链接它。
 
然后,在“配置属性”-》C/C++-》常规-》附加包含目录,加入../,因为我们的程序需要inlclude文件夹下的头文件,include目录位于上一级目录。
 
 
其次,将cefclient项目属性页中的链接器-》常规-》附加库目录的内容全部拷贝到CEFBrowser项目的相应位置:
 
 
最后,将cefclient属性页的输入-》附加依赖项中的内容全部拷贝到CEFBrowser项目的相应位置,并且将最后的$(Configuration)\libcef.lib前面加上../改为../$(Configuration)\libcef.lib
 
 
以上工程的环境就配置好了,下面开始添加使用cef的代码:
 
  • 给CEFBrowser工程添加一个空白的头文件:ExampleCefApp.h,文件中加入如下代码:

    1. #pragma once
    2. #include "include/cef_app.h"
    3. class ExampleCefApp : public CefApp
    4. {
    5. public:
    6. ExampleCefApp ()
    7. {
    8. }
    9. virtual ~ExampleCefApp ()
    10. {
    11. }
    12. private:
    13. IMPLEMENT_REFCOUNTING (ExampleCefApp);
    14. };
  • 在给CEFBrowser工程添加一个空白的头文件:ExampleCefHandler.h,文件中加入如下代码:

    1. #pragma once
    2. #include "include/cef_client.h"
    3. class ExampleCefHandler : public CefClient,
    4. public CefContextMenuHandler,
    5. public CefDisplayHandler,
    6. public CefDownloadHandler,
    7. public CefDragHandler,
    8. public CefGeolocationHandler,
    9. public CefKeyboardHandler,
    10. public CefLifeSpanHandler,
    11. public CefLoadHandler,
    12. public CefRequestHandler
    13. {
    14. public:
    15. ExampleCefHandler();
    16. virtual ~ExampleCefHandler();
    17. CefRefPtr<CefBrowser> GetBrowser();
    18. #pragma region CefClient
    19. // since we are letting the base implementations handle all of the heavy lifting,
    20. // these functions just return the this pointer
    21. virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler () OVERRIDE;
    22. virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler () OVERRIDE;
    23. virtual CefRefPtr<CefDownloadHandler> GetDownloadHandler () OVERRIDE;
    24. virtual CefRefPtr<CefDragHandler> GetDragHandler () OVERRIDE;
    25. virtual CefRefPtr<CefGeolocationHandler> GetGeolocationHandler () OVERRIDE;
    26. virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler () OVERRIDE;
    27. virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler () OVERRIDE;
    28. virtual CefRefPtr<CefLoadHandler> GetLoadHandler () OVERRIDE;
    29. virtual CefRefPtr<CefRequestHandler> GetRequestHandler () OVERRIDE;
    30. #pragma endregion // CefClient
    31. #pragma region CefDownloadHandler
    32. // this function is virtual and must be implemented; we do nothing in it, so downloading files won't work as the callback function isn't invoked
    33. virtual void OnBeforeDownload (CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item, const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback);
    34. #pragma endregion // CefDownloadHandler
    35. #pragma region CefLifeSpanHandler
    36. // cache a reference to the browser
    37. virtual void OnAfterCreated (CefRefPtr<CefBrowser> browser) OVERRIDE;
    38. // release the browser reference
    39. virtual void OnBeforeClose (CefRefPtr<CefBrowser> browser) OVERRIDE;
    40. #pragma endregion // CefLifeSpanHandler
    41. protected:
    42. // the browser reference
    43. CefRefPtr<CefBrowser> browser;
    44. // Include the default reference counting implementation.
    45. IMPLEMENT_REFCOUNTING (ExampleCefHandler);
    46. // Include the default locking implementation.
    47. IMPLEMENT_LOCKING (ExampleCefHandler);
    48. };
  • 然后给CEFBrowser工程添加一个空白的源文件:ExampleCefHandler.cpp,加入代码如下:
    1. #include "stdafx.h"
    2. #include "ExampleCefHandler.h"
    3. ExampleCefHandler::ExampleCefHandler ()
    4. {
    5. }
    6. ExampleCefHandler::~ExampleCefHandler ()
    7. {
    8. }
    9. CefRefPtr<CefBrowser> ExampleCefHandler::GetBrowser ()
    10. {
    11. return browser;
    12. }
    13. CefRefPtr<CefContextMenuHandler> ExampleCefHandler::GetContextMenuHandler ()
    14. {
    15. return this;
    16. }
    17. CefRefPtr<CefDisplayHandler> ExampleCefHandler::GetDisplayHandler ()
    18. {
    19. return this;
    20. }
    21. CefRefPtr<CefDownloadHandler> ExampleCefHandler::GetDownloadHandler ()
    22. {
    23. return this;
    24. }
    25. CefRefPtr<CefDragHandler> ExampleCefHandler::GetDragHandler ()
    26. {
    27. return this;
    28. }
    29. CefRefPtr<CefGeolocationHandler> ExampleCefHandler::GetGeolocationHandler ()
    30. {
    31. return this;
    32. }
    33. CefRefPtr<CefKeyboardHandler> ExampleCefHandler::GetKeyboardHandler ()
    34. {
    35. return this;
    36. }
    37. CefRefPtr<CefLifeSpanHandler> ExampleCefHandler::GetLifeSpanHandler ()
    38. {
    39. return this;
    40. }
    41. CefRefPtr<CefLoadHandler> ExampleCefHandler::GetLoadHandler ()
    42. {
    43. return this;
    44. }
    45. CefRefPtr<CefRequestHandler> ExampleCefHandler::GetRequestHandler ()
    46. {
    47. return this;
    48. }
    49. void ExampleCefHandler::OnBeforeDownload (CefRefPtr<CefBrowser> browser,
    50. CefRefPtr<CefDownloadItem> download_item,
    51. const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback)
    52. {
    53. UNREFERENCED_PARAMETER (browser);
    54. UNREFERENCED_PARAMETER (download_item);
    55. callback->Continue (suggested_name, true);
    56. }
    57. void ExampleCefHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser)
    58. {
    59. CefLifeSpanHandler::OnAfterCreated (browser);
    60. }
    61. void ExampleCefHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser)
    62. {
    63. CefLifeSpanHandler::OnBeforeClose (browser);
    64. }
  • 切换到“类视图”,右键点击CCEFBrowserView-》属性,在属性对话框中给类CCEFBrowserView添加WM_CREATE的响应函数OnCreate。在CEFBrowserView.cpp文件开头处加入如下代码:
    1. #include "ExampleCefApp.h"
    2. #include "ExampleCefHandler.h"
    3. #define INVALID_HWND (HWND)INVALID_HANDLE_VALUE
    4. namespace
    5. {
    6. CefRefPtr<ExampleCefHandler> example_cef_handler;
    7. HWND application_message_window_handle = INVALID_HWND;
    8. }

    OnCreate函数的代码如下:

    1. int CCEFBrowserView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    2. {
    3. if (CView::OnCreate(lpCreateStruct) == -1)
    4. return -1;
    5. // TODO:  在此添加您专用的创建代码
    6. CefMainArgs main_args ( AfxGetApp()->m_hInstance );
    7. CefRefPtr<ExampleCefApp> app (new ExampleCefApp);
    8. if (CefExecuteProcess(main_args, app.get()) == -1)
    9. {
    10. CefSettings settings;
    11. CefSettingsTraits::init( &settings);
    12. settings.multi_threaded_message_loop = true;
    13. CefInitialize (main_args, settings, app.get());
    14. example_cef_handler = new ExampleCefHandler();
    15. CefWindowInfo info;
    16. info.SetAsChild(m_hWnd, CRect(0, 0, 1200, 1200));
    17. CefBrowserSettings settings1;
    18. CefBrowserHost::CreateBrowser(info, example_cef_handler.get(), CefString ("http://www.sina.com"), setting1, NULL);
    19. }
    20. return 0;
    21. }

至此,所添加的代码完毕,好了现在编译工程CEFBrowser,在Debug目录

(我的路径是D:\cef_binary_3.1650.1562_windows32\Debug)中确认生成了CEFBrowser.exe,

同时编译器自动的将需要的一些CEF文件也拷贝到了此文件夹下。此时还不能成功运行CEFBrowser.exe

显示出页面,需要将上面我们编译cefclient项目产生的locales文件夹和cef.pak文件

(D:\cef_binary_3.1650.1562_windows32\out\Debug目录中)拷贝到Debug目录下

(提示是否替换,选择是),好了现在可以运行CEFBrowser.exe显示出新浪的页面了(结果如下图)。

Chromium Embedded Framework的更多相关文章

  1. Chromium Embedded Framework 中文文档(简介)

    转自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html 简介 Chromium Embedded Framework ...

  2. 利用 Chromium Embedded Framework (CEF) 定制提取 Flash 视频的浏览器

    功能介绍: 利用 CEF 分析网页源码, 提取 flash 视频的代码. 提取的视频代码 LoadString 和 JS 两种方式重新插入到浏览器. (CEF_3.2171.1979_win32 - ...

  3. Chromium Embedded Framework (CEF)_3.2171.2069_v20170606_x86.tar.xz

    CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 [增加了960x90% 和 1280x90%] 这次修改是主要针对 YY web 直播平台 ...

  4. Chromium Embedded Framework (CEF)_3.2171.1979_v20170602_x86.tar.xz

    CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 这次修改是主要针对 YY web 直播平台 对录屏的朋友有很大帮组 CEF_3.2171.1 ...

  5. Create an Embedded Framework in Xcode with Swift

    转自:http://zappdesigntemplates.com/create-an-embedded-framework-in-xcode-with-swift/ Post Series: Cre ...

  6. 如何在Windows上从源码编译Chromium (CEF3) 加入mp3支持

    一.什么是CEF CEF即Chromium Embeded Framework,由谷歌的开源浏览器项目Chromium扩展而来,可方便地嵌入其它程序中以得到浏览器功能. CEF包括CEF1和CEF3两 ...

  7. 构建基于Chromium的应用程序

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  8. 构建基于Chromium的应用程序(Winform程序加载Html页面)

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  9. Winform下CefSharp的引用、配置、实例与报错排除(源码)

    Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...

随机推荐

  1. webpack.config.js====CSS相关:postcss-loader加载器,自动添加前缀

    1. 在webpack中加载css需要先安装style-loader 和 css-loader cnpm install --save-dev style-loader css-loader 2. 在 ...

  2. Spring 整合 Quartz 实现动态定时任务(附demo)

    最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

  3. 洛谷 CF1148A Another One Bites The Dust

    Another One Bites The Dust CF的题目在你谷上难度虚高似乎已成常态 不过这道题相比于愚人节的那几道相对好得多,没有被评成紫题. 这道题题面意思比较清楚,就是对于给定数量的'a ...

  4. Kendo MVVM (一) 概述

    Kendo MVVM (一) 概述 Model View ViewModel (MVVM)  是开发人员经常使用的一种设计模式,以实现数据模型(Model)和视图(View)的分离.MVVM 中的 V ...

  5. 变更gcc版本

    当前的GCC版本为GCC-4.2,需要切换到GCC-3.4.首先,你需要去你的usr/bin/下去看看有没有gcc-3.4这样文件,如果没有的话,就安装一下吧: apt-get install gcc ...

  6. Python+selenium之Page Object设计模式

    Page Object是selenium自动化测试项目开发实践的最佳设计模式之一,他主要提现在对界面交互细节的封装,这样可以使测试案例隔你给加关注于业务而非界面细节,从而提高测试案例的可读性. Pag ...

  7. 【UML】部署图Deployment diagram(实现图)(转)

    http://blog.csdn.net/sds15732622190/article/details/49049665 前言 下面要介绍UML中的部署图,和构件图一样,它也属于实现图的一种,五种静态 ...

  8. [CV笔记]OpenCV机器学习笔记

    KNN算法: 目的是分类,具体过程为,先训练,这个训练我估计只是对训练数据进行一个存储,knn测试的过程是根据测试样例找出与这个样例的距离最近的k个点,看这k个点中哪个分类所占的比例比较多,那么这个样 ...

  9. Cenos7—安装

    1. 进入安装界面 2. 选择语言 3. 进行分区 4. 设置root密码

  10. Bootstrap历练实例:语境色彩的面板

    带语境色彩的面板 使用语境状态类 panel-primary.panel-success.panel-info.panel-warning.panel-danger,来设置带语境色彩的面板,实例如下: ...