关于CEF基本使用

     基本框架

  1. CEF 使用了多进程。主进程是“browser”进程,负责窗口管理,界面绘制和网络交互, 子进程rederes负责Blink的渲染和Js的执行、Js Binding和对Dom节点的访问默认的进程模型中,会为每个标签页创建一个新的"render"进程,除此之外还有plugins, GPU子进程,这些进程按需创建,象管理插件的进程和处理合成加速的进程。
  2. 在ECF的所有进程中,都可以有多线程。CEF提供了函数和接口在不同的线程中来传递任务。
    • TID_UI :线程是浏览器的主线程。如果应用程序在调用调用CefInitialize()时,传递CefSettings.multi_threaded_message_loop=false,这个线程也是应用程序的主线程。

    • TID_IO :线程主要负责处理IPC消息以及网络通信。
    • TID_FILE :线程负责与文件系统交互
  3. 一些回调方法和函数只能在特定线程和进程中使用。在使用API之前请确保仔细阅读注释。

   关键接口

     a. CefHandler

            浏览器通知是通过注册的委托接口由浏览器发到客户端程序的通知, CefHandler是最主要的委托接口, CefJSHandler则用于实现自定义的

       Javascript对象。

       CefHandler支持以下接口:

  • 窗口创建之前 (BeforeCreated),客户端可用之取消与定制浏览器窗口创建过程。
  • 窗口创建之后(AfterCreated). 可用于创建自定义的CefJSHandler对象。
  • 地址栏更新(AddressChange). 将地址栏更改为指定的字符串,通知发生于导航提交后与页面加载前。
  • 标题更新(TitleChange). 将标题更改为指定的字符串,发生在页面加载中。
  • 浏览前(BeforeBrowse). 可用于取消导航,该事件的信息包括URL,Post数据,请求头.
  • 开始加载(LoadStart). 
  • 加载结束 (LoadEnd). 
  • 加载错误(LoadError). 加载过程中遇到错误,应用程序可提供自定义的错误页面.
  • 资源加载前 (BeforeResourceLoad). 应用程序可提供替代的数据源 (比如内存中的缓存)或者取消加载.
  • 显示菜单前(BeforeMenu). 可用于取消上下文菜单显示或定制菜单,默认情况下,浏览器根据上下文显示基本的菜单.
  • 获取菜单标签(GetMenuLabel).在默认菜单显示前,每个菜单项调用一次,可用于将英文默认内容改为其它语言.
  • 菜单动作(MenuAction). 用户从默认上下文菜单选择了一个选项,可用自己的方式来处理动作。
  • 打印选项(PrintOptions). 打印设置对话框显示前调用,可用于定制页面大小、方向与边距等.
  • 打印页眉页脚 (PrintHeaderFooter). 在页面视图输出到打印上下文,但是页面结束前,可在预定义的6个位置(上左、上中、上右、下左,下中,下右)插入自定义的页眉、页脚字符串。该事件附带的信息包括当前URL、标题、页码、总页数、打印上下文、页边距与DPI拉伸比.
  • JavaScript警告 (JSAlert). 应用程序可自定义Javascript Alert窗口.
  • JavaScrip确认 (JSConfirm). 应用程序可自定义Javascript Comfirm窗口
  • JavaScrip提示 (JSPrompt). 应用程序可自定义Javascript Prompt窗口
  • JavaScript Window 对象绑定 (JSBinding). 应用程序将用户定义的方法和变量附加到frame的window对象上
  • Window关闭前 (BeforeWindowClose). 窗口关闭前
  • 获得焦点(TakeFocus). 浏览器组件失去焦点前调用
  • 设置焦点(SetFocus). 浏览器组件请求焦点前调用
  • 键盘事件(KeyEvent). 浏览器组件接收到键盘事件时
  • 提示 (Tooltip). 用于修改tooltip文字
  • 控制台消息 (ConsoleMessage). 用于显示控制台消息.
  • 查询结果(FindResult).用于自定义查找结果显示处理

       CefV8Handler支持以下通知:

  • 执行事件(Execute). 应用程序执行指定的函数,该事件提供所有的Javascript参数,而且应用程序能指定返回值

不同版本接口可能会稍微有点差别,但大致的功能是一样的。

     b. CefBrowser、CefFrame

      浏览器事件由客户端应用程序通过CefBrowser和CefFrame的函数发送给浏览器:

  • 后退、前进、重新加载与停止加载,用于控制浏览器导航.
  • 撤消、重做、剪切、复制、粘贴、删除、全选,用于控制目标区域内容.
  • 打印. 打印目标框架.
  • 查看源代码. 将目标框架的HTML源代码保存到临时文件,并用默认的文本查看程序打开之
  • 加载URL. 在指定框架中加载指定URL
  • 载入字符串. 根据一个假URL在指定框架中加载某个字符串
  • 加载流. 根据一个假URL,在指定框架中加载二进制数据
  • 加载请求. 在指定框架中加载请求(URL, method, request data 与 headers) .
  • 执行脚本. 在目标框架中执行任意Javascript命令

        CEF特性

        a.JavaScript扩展

              CEF支持可以和原生应用程序代码交互的Javascript扩展,参见cef.h的CefRegisterExtension() 函数和cefclient示例程序

              的"JavaScriptExtension Handler" 以及 "UI App Example" 测试 .

       b.自定义Schemes

              CEF支持注册与处理自定义scheme,类似于myscheme://mydomain。参见cef.h中的CefRegisterScheme()函数与示例应用程序cefclient中

              的 "Scheme Handler" 测试.

        c.框架实现概览

              CEF所有的类以Cef为前缀.

        d.框架准备与拆卸

              UI消息循环由框架创建的一个单独线程处理,客户端程序应负责通过分别调用CefInitialize()和CefShutdown() 来为每个进程准备与关闭这一

      线程。

        e.引用计数

              所有实现了CefBase接口的框架类与对象指针都由CefRefPtr智能指针实现来处理,通过调用AddRef()和Release()自动处理引用计数。

        f.平台无关

             CEF框架被设计成平台无关,需要当前我们仅支持windows平台,但是我们计划将来支持其它平台。为了尽可能减少双平台支持带来的麻

     烦,框架定义了一系列实现无关的接口与类型定义包装跨平台的行为。

        g.线程安全

            框架的所有接口实现必须是跨线程访问安全的,CefThreadSafeBase 模版提供原子的AddRef() 和 Release() 实现,还提供Lock() 和          

    Unlock()方法以同步方式访问代码块.

        h.框架接口

             框架定义了如下接口:

  • CefBrowser 是主要的浏览器host类,通过它的静态方法CefBrowser::CreateBrowser()方法创建新浏览器窗口.
  • CefFrame 表示浏览器窗口里的一个框架(frame),每个浏览器窗口都有一个顶级的主框架,可通过CefBrowser::GetMainFrame()方法访问之.
  • CefHandler 是传给CefBrowser::CreateBrowser()方法的最主要委托接口.
  • CefRequest 表示请求数据,比如url, method, post data 和 headers.
  • CefPostData 和 CefPostDataElement 表示可能是请求一部分的post数据.
  • CefSchemeHandlerFactory 和 CefSchemeHandler 用于处理像myscheme://mydomain这样的自定义scheme.
  • CefStreamReaderCefStreamWriterCefReadHandler 和 CefWriteHandler 读写数据的简单的接口.
  • CefV8Handler 和 CefV8Value 用于创建和访问Javascript对象.

    使用流程

       cefsimple 工程初始化CEF并创建了一个简单的浏览器窗口。

  1.  系统在入口点函数中(man或者wWinMain)函数中开启browser进程
  2.  入口点函数:
    1. 创建SimpleApp的实例,在这个类中保存process-level callbacks.
    2. 初始化CEF并开启消息循环。
  3.  当CEF初始化完毕以后, SimpleApp::OnContextInitialized()会被调用。在这个方法中:
    1. 创建一个单例的SimpleHandler
    2. 由CefBrowserHost::CreateBrowserSync()创建一个浏览器窗口
  4.  所有的浏览器共享同一个在SimpleHandler。SimpleHandler负责定制浏览器的行为并保存browser-related callbacks(loading状态,标题行为等)
  5.  当浏览器窗口被关闭的时候, SimpleHandler::OnBeforeClose() 被调用。当所有浏览器窗口被关闭,CEF消息循环退出。

     可以看下如下代码:

int APIENTRY wWinMain(HINSTANCE hInstance
                  , HINSTANCE hPrevInstance
                  , LPTSTR lpCmdLine
                  , int nCmdShow)
{
    CefMainArgs args(hInstance);

    CefRefPtr<MySimpleApp> app(new MySimpleApp);

    int exitCode = CefExecuteProcess(args, app, NULL);
    if(exitCode >= 0) return exitCode;
    CefSettings settings;
    CefInitialize(args, settings, app, NULL);

    CefRunMessageLoop();
    CefShutdown();
    return 0;
}

此时进程开启,但是没有任何窗口, 如果我们需要建立窗口需要如下

CefWindowInfo winInfo;
winInfo.SetAsPopup(NULL, "myCefSimple");

CefBrowserSettings browser_settings;

CefRefPtr<CefClient> client(new MySimpleClient());
std::string url = "file:///D:/project/github/cptf/resource/binding.html";

CefBrowserHost::CreateBrowser(winInfo
    , client.get()
    , url
    , browser_settings
    , NULL);

这样就显示出来窗口了。
但是我们发现在关闭的时候进程没有关掉, 所以我们要做如下动作。

class MySimpleClient : public CefClient
                , public CefLifeSpanHandler


void MySimpleClient::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
    CEF_REQUIRE_UI_THREAD();

    CefQuitMessageLoop();
}

   总结

    (1) App和Client是CEF中最重要的两个类。与MFC中的theApp和Dialog差不多,App是初始化实例,client负责消息或事件的响应。

    (2)CefExecuteProcess 和 CefInitialize 是建立app的两个最重要方法。而CreateBrowser 是创建浏览器窗口的最重要方法。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF是一种用于创建Windows桌面应用程序的技术,而CefSharp是一个针对.NET应用程序的Chromium嵌入式浏览器框架。结合使用WPF和CefSharp,我们可以创建一个自定义的浏览器应用程序。 首先,我们需要在WPF项目中添加CefSharp的引用,以便能够使用相关功能和组件。接下来,我们可以在XAML文件中创建一个WebBrowser控件,这个控件将会是我们浏览器应用程序的主要窗口。在代码中,我们可以使用CefSharp的API来配置浏览器的行为,比如加载URL、前进、后退、刷新等操作。 为了实现这些功能,我们需要编写一些C#代码。首先,我们需要初始化CefSharp的设置,并在应用程序启动时进行加载。然后,我们可以在浏览器的事件处理程序中编写代码,以响应用户的行为,例如在URL改变时加载新的页面,或在点击后退按钮时返回上一页。 此外,我们还可以通过使用CefSharp提供的API,实现一些其他的自定义功能。例如,我们可以通过JavaScript与浏览器进行交互,执行一些特定的脚本操作,或者通过注入自定义的CSS样式来修改网页的外观。 总而言之,使用WPF和CefSharp,我们可以创建一个功能强大且自定义的浏览器应用程序。通过灵活运用CefSharp的API,我们可以实现各种浏览器相关的功能,并与用户进行交互。这是一个非常有用且有趣的项目,可以满足用户对浏览器的个性化需求。 ### 回答2: WPF是一种用于创建富客户端应用程序的开发框架,而CEFSharp是基于Chromium内核的用于嵌入式浏览器的开源框架。使用CEFSharp可以很方便地在WPF应用程序中嵌入浏览器功能。 首先,我们需要在WPF应用程序中添加CEFSharp的NuGet包。然后在XAML中创建一个WindowsFormsHost控件,用于嵌入浏览器。接下来,我们可以在代码中用CEFSharp的ChromiumWebBrowser控件来加载和显示网页。 加载一个网页非常简单,只需调用ChromiumWebBrowser的Load方法并传入网页的URL即可。此外,我们还可以注册一些事件来处理浏览器的加载完成、加载进度、错误等情况。例如,可以使用LoadEnd事件来监听页面加载完成,然后执行一些自定义逻辑。 此外,我们还可以通过调用ChromiumWebBrowser的ExecuteScriptAsync方法来在加载的网页中执行JavaScript代码。这使得我们可以通过与网页进行交互,实现一些复杂的功能。 在加载和显示网页时,我们也可以通过相关API来控制浏览器的行为,比如设置代理、禁用/启用JavaScript、禁止弹出窗口等。 总的来说,使用CEFSharp可以很方便地在WPF应用程序中嵌入浏览器功能。无论是显示网页,还是与网页进行交互,都可以通过CEFSharp轻松实现。这为开发者提供了更多的可能性,使得我们可以在WPF应用程序中创造出更加丰富和复杂的浏览器体验。 ### 回答3: WPF(Windows Presentation Foundation)是一种用于开发Windows应用程序的框架,而CefSharp是一个基于谷歌开源项目Chromium Embedded Framework (CEF)的.NET库,它允许在WPF应用程序中嵌入一个完整的浏览器。 使用CefSharp在WPF应用程序中创建一个浏览器可以带来许多好处。首先,由于使用了Chromium的底层技术,CefSharp浏览器具有出色的跨平台兼容性和稳定性。它能够处理各种网页内容,包括HTML,CSS,JavaScript和其他多媒体元素。其次,CefSharp提供了强大的API,开发人员可以使用C#编写代码来控制浏览器的行为。这使得对浏览器的定制和扩展变得非常容易。 要在WPF中集成CefSharp浏览器,首先需要将CefSharp的NuGet包添加到项目中。然后,在需要嵌入浏览器的窗体中,可以使用XAML定义一个WebBrowser控件。接下来,在代码中初始化CefSharp,并设置WebBrowser控件的源为所需的URL或页面内容。 开发人员可以使用C#代码与嵌入的浏览器进行交互。例如,可以使用CefSharp的API执行一些常见的浏览器操作,如导航到新的URL,前进和后退浏览历史记录,或者捕获页面上的事件。此外,还可以通过JavaScript与页面进行交互,实现双向通信。 除了基本的浏览功能,CefSharp还提供了一些高级功能,如自定义页面呈现,浏览器扩展和弹出窗口管理。这些功能使得开发人员能够根据需要定制浏览器的外观和行为。 总之,使用CefSharp在WPF应用程序中创建一个浏览器是一种简单而强大的方法,可以使应用程序获得Web浏览功能,并根据需要进行自定义和扩展。无论是实现一个简单的浏览器界面还是构建一个复杂的浏览器应用程序,CefSharp都能提供所需的功能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值