基于 Win32Exts for Python 的 CEF 浏览器框架介绍

===============================================

 

     在 Python 中使用 CEF 目前已有比较成熟的(虽然并不完善)的 cefpython 项目。

Win32Exts for Python 本着功能尽善尽美的原则,目前也支持 CEF 框架,

如果觉得 cefpython 项目依赖过多或者不能实现自己需求的话,可以考虑一下使用 Win32Exts 作为代替方案。

     Win32Exts for Python 下载地址:

     https://github.com/tankaishuai/win32exts_for_Python

   (目前仅 x86 版本支持,请确保下载 32位的 Python, 2.x 或者 3.x 均可

     将 x86 版本的 win32exts.pyd 置于 Python 安装目录 /DLLs 下面,仅需此一个模块即可。

 

     然后下载 CEF 框架的依赖 Dlls (libcef.dll 等),建议使用 CEF 49 内核,可以搜索【cef_binary_3.2623】自行下载,

     或者从笔者 github 的项目地址上提取:

     https://github.com/tankaishuai/WebBrowser_Wrapper

     下载后将 CEF 框架的依赖 Dlls 也一并放入:Python 安装目录 /DLLs 下面,或者路径加入环境变量中。

     

     以上如果实在不知道如何操作,可以直接下载笔者当前所用的 Python 2.7 x86 懒人包,解压缩就可直接食用

            链接: https://pan.baidu.com/s/1Do5JW0SpnE7TByLDMyNuUQ  提取码: 2xut

 

     需要说明的是, Win32Exts 并不是专为 CEF 开发的一个项目,其涵盖功能极为丰富。对 CEF 的支持以导出的若干

cef_webview_****() 开头的接口实现。关于在 Python 中使用 Win32Exts 的基本用法,请参阅, 在此不谈:

     Python 调用 Windows Win32 API COM 新法

    

    以及笔者的其它博文。

 

 

   github 项目上的 cef_webview_demo.py 文件为 CEF 的一个简单 demo, 下面简要介绍下具体用法:

 

  1、首先需要初始化 win32exts 基本库:

import win32exts
       win32exts.load_sym("*", "*")

 

2、创建cef对象:

hParent = None
       init_url = None
       cef = win32exts.cef_webview_createA("cef", hParent, x, y, width, height, init_url)

      其中

     (x, y, width, height) 四个参数指定了 webview 创建的具体位置,

                 当然后续也可以使用 win32exts.cef_webview_set_bounds() 修改之。

       init_url 参数指定了加载的 url 地址,当然后续也可以使用 win32exts.cef_webview_load_urlA/W 接口加载 url。

 

3、cef初始化,指定事件通知函数:

         ret = win32exts.cef_webview_init(cef, win32exts.callback("OnWebViewEvent"))

        OnWebViewEvent 为指定的一个事件通知函数,其名称随意,函数格式为:

     

def OnWebViewEvent(args):
                       return "0, 0"

 

4、进入消息循环:

         win32exts.cef_webview_message_loop()

 

 

5、释放 cef:

          win32exts.cef_webview_destroy(cef)

 

 

 

     整个基本框架大致如上。可见重点是事件通知函数的编写,一般来说, OnWebViewEvent()可以使用下述模板编写:

     

def OnWebViewEvent(args):
     #取参数包
     event = win32exts.read_wstring(win32exts.arg(args, 2))
     status = win32exts.arg(args, 3)
     param1 = win32exts.arg(args, 4)
     if param1 > 0:
         param1 = win32exts.read_wstring(param1)
     param2 = win32exts.arg(args, 5)
     if param2 > 0:
         param2 = win32exts.read_wstring(param2)
     print(event, status, param1, param2)    #事件分流
     if "OnViewCreated" == event:
         OnViewCreated()
     elif "OnViewDestroy" == event:
         OnViewDestroy()
     elif "OnDocumentReady" == event:
         OnDocumentReady()
     elif "OnLoadingFailed" == event:
         OnLoadingFailed(param1, param2)
     elif "OnUrlChanged" == event:
         OnUrlChanged(param1)
     elif "OnTitleChanged" == event:
         OnTitleChanged(param1)
     elif "OnNewView" == event:
         OnNewView(param1)
     elif "OnExecute" == event:
         OnExecute(status, param1, param2)
     elif "FreeResult" == event:
         FreeResult(status)
     elif "OnExecuteCallback" == event:
         OnExecuteCallback(status, param1, param2)
     
     return "0, 0"

 

至于具体更详细的用法,请参阅示例 github 上的示例 demo,

 

最后列出 Win32Exts 提供的 CEF 接口列表:

 

cef_webview_message_loop(pfnInit, pfnThreadWndProc, pfnTerm);
cef_webview_createW(engine_type, hParent, x, y, w, h, url, cmd);
cef_webview_createA(engine_type, hParent, x, y, w, h, url, cmd);
cef_webview_destroy(handle);
cef_webview_free_buffer(p);
 cef_webview_init(handle,  pfnHandler);
 cef_webview_set_cookiesW(handle, url, cookie);
 cef_webview_get_cookiesW(handle, url);
 cef_webview_load_urlA(handle, url, cookie);
 cef_webview_load_urlW(handle, url, cookie);
 cef_webview_show(handle, bShow);
 cef_webview_set_bounds(handle, x, y, width, height);
 cef_webview_mute_volume(handle, bMute);
 cef_webview_get_attrW(handle, key, pValue, pdwSize);
 cef_webview_set_attrW(handle, key, pValue, dwSize);
 cef_webview_get_attr_intW(handle, key);
 cef_webview_set_attr_intW(handle, key, intValue);
 cef_webview_get_attr_strW(handle, key);
 cef_webview_set_attr_strW(handle, key, strValue);
 cef_webview_get_attr_intA(handle, key);
 cef_webview_set_attr_intA(handle, key, intValue);
 cef_webview_get_attr_strA(handle, key);
 cef_webview_set_attr_strA(handle, key, strValue);
 cef_webview_execW(handle, szFunction, pfnHandler, dwTimeout, pszArgument1, ...);
 cef_webview_execA(handle, szFunction, pfnHandler, dwTimeout, pszArgument1, ...);
 cef_webview_exec_v2W(handle, szFunction, pfnHandler, pszArguments, dwArgumentCount, dwTimeout);
 cef_webview_exec_v2A(handle,  szFunction, pfnHandler, pszArguments, dwArgumentCount, dwTimeout);
 cef_webview_cancel(handle, lExecId);
 cef_webview_registerW(handle, szFunction, pfnHandler);
 cef_webview_registerA(handle, szFunction, pfnHandler);
 cef_webview_unregisterW(handle, szFunction);
 cef_webview_unregisterA(handle, szFunction);
 cef_webview_context_menuW(handle, uMenuId, szText, szStyle, szFunction);