转载请说明出处,谢谢~~

昨天封装了基于webkit的wke浏览器内核,做成了duilib的浏览器控件,实现了浏览功能,但是单单的浏览功能还不满足需求,在我的仿酷狗项目中乐库的功能需要与浏览器互交。

大家知道在使用酷狗浏览器时,右侧的乐库,当我们选中了某个音乐,这时酷狗就会去缓冲并且播放响应的歌曲。本身浏览器与c++的窗体是不会互交的。而酷狗使用的IE浏览器内核,在c++代码中对CHtmlView类进行继承和重写,并完成IDispatchEx接口的相关工作后,就可以开启IE内核的互交的功能,可以控制网页的元素,也可以让网页元素去调用c++的代码。
    而我现在是用来wke内核, 而这个wke内核网上使用的人并不多,所以相关文档也好,我要给它增加与c++互交的功能就需要自己去探索了。
    阅读了好几遍wke的头文件后有了些眉目,我看到原作者的WkeBrowser demo中,使用了RunJs函数来隐藏掉网页的滚动条,然后进行对网页的截图工作,这一点给了我启发,也就是使用js脚本命令去控制wke内核中显示的网页,先看看runJs函数的原型:
virtual jsValue runJS(const wchar_t* script) = 0;  函数比较简单,通过名字可以看到参数script是传递js命令的字符串指针,而函数返回一个jsValue类型的值,这是wke内核自定义的类型,这个返回值可以通过wke内核提供的其他函数去解析出相关的值。
    我在昨天封装的浏览器控件类CWkeWebkitUI增加了一个RunJs接口,接口原型为wstring RunJS(wstring strValue);接口的函数体为

wstring CWkeWebkitUI::RunJS(wstring strValue)
{
jsValue jsRet = m_pWindow->m_pWebView->runJS(strValue.c_str());
return jsToStringW(m_pWindow->m_pWebView->globalExec(), jsRet);
}

在接口中我调用wke内核去执行js命令,然后把他的返回值进行处理,最后得到一个字符串再传回来。然后对这个接口的可用性进行测试。 测试命令为window.scrollTo(0,100)。这条命令的意识让滚动条向下滚动100单位。

     

可以看到执行完js命令后浏览器的确向下滚动了100单位,证明这样是可行的,接下来我有执行了几条命令:

    document.body.style.overflow='hidden'
    document.getElementsByName("uname")[0].value
    document.getElementById("nameid").value

window.scrollTo(0,document.body.scrollHeight) 
    这几条命令分别测试隐藏滚动条,修改或者获取input标签内的内容等,都测试通过了,到此我完成了一般的互交功能,也就是用c++控制网页。

接下来是完成网页控制c++的互交部分,这部分让我比较头疼,因为没有资料去参考,读wke头文件后发现了三个可疑的函数,原型为

    WKE_API void jsBindFunction(const char* name, jsNativeFunction fn, unsigned int argCount);
    WKE_API void jsBindGetter(const char* name, jsNativeFunction fn); /*get property*/

WKE_API void jsBindSetter(const char* name, jsNativeFunction fn); /*set property*/ 
    从名字上判断是js绑定函数,这个很有可能是我想要的东西,可以没有demo做参考,我只能自己琢磨,测试了几个小时候明白了这个函数的用法。那就是在c++创建wke内核实例前,调用jsBindFunction函数,函数的第一个参数是js中的函数名,第二个参数是对应的c++的函数的地址,第三个参数是传递的参数的个数,比如我在c++中申明了一个函数名为js_msgBox,原型为jsValue
JS_CALL js_msgBox(jsExecState es),那么我编写的jsBindFunction的代码为jsBindFunction("msgBox", js_msgBox, 2); 紧接着在网页的js代码中找一个合适的出发互交的地方,写上代码,比如这个

    注意这个函数的名字要和 jsBindFunction语句的第一个参数保持一直。那么当用wke内核接在了这个网页,并且出发了我定义的NagivOut函数是,就自动调用msgBoxz这个函数,这个函数会被wke转发到c++,回调js_msgBox函数,我在js_msgBox函数中弹出对话框显示了msgBox函数传进来的参数,结构成功了
,至此js主动调用c++的功能也实现了。

再比如在我们的代码中使用RunJs函数执行这条js语句:

  1. document.getElementById("navig-01_").onclick=test

这样就动态得让id为navig_01_的元素的onclick事件绑定到test()函数,而test函数里可以再调用c++的函数,实现了c++绑定到网页的元素的事件。还有很多功能都可以使用我介绍的这两种方法来实现,我就不一一介绍了,大家自己使用吧。
    通过这篇日志可以看到,wke使用起来很简单,也很方便,只需要少量代码就可以实现c++与webkit内核的互交。
    贴一张效果图 

2014.7.26 15:04  Redrain 

给Webkit内核的浏览器控件增加互交功能的更多相关文章

  1. 为Form中的控件增加自适应功能 转

    创建一个基于Custom的类resizeable,并新建属性和方法程序,其说明如下: a) 新建属性: posiTyperList 可调整位置的控件类型列表sizeTypeList 可调整大小的控件类 ...

  2. 基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址

    转载请说明原出处,谢谢~~ 前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布.其实这个控件封装起来没什么难度 ...

  3. 将webkit内核封装为duilib的浏览器控件

    转载请说明出处,谢谢~~ 原本的duilib是自带浏览器控件的,但是使用了IE内核,我在做仿酷狗音乐播放器时,在右侧乐库要用到浏览器控件,而我使用自带的IE控件却发现了不少缺点,这也是duilib一直 ...

  4. CEF中文教程(google chrome浏览器控件) -- Windows下编译Chromium

    CEF中文教程(google chrome浏览器控件) -- CEF简介 2013-04-10 16:48 42928人阅读 评论(4) 收藏 举报  分类: CEF(2)    目录(?)[+]   ...

  5. java浏览器控件jxbrowser(简单demo模拟自动登录与点击)

    写在前面: 老大让我写个脚本自动给他写dms有一段时间了,说实话当时不知道老大指的这个脚本是什么?毕竟是做web的,难道是写个数据库sql语句脚本吗?也就放在了一边.巧了,最近一个朋友说他之前写了个程 ...

  6. 用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件

    用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件用C#编写ActiveX控件 开发浏览器控件这是本控件开发完成后的一个简单应用.我们可以利用它以本地文件夹为单位来批量更新服务器的 ...

  7. 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

    [源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...

  8. 增加duilib edit控件的提示功能和多种文字颜色

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41786407 duilib的CEditUI控件内部使用了win32的原生 ...

  9. 关于WebBrowser(浏览器)控件的调用

    原文:关于WebBrowser(浏览器)控件的调用 在VS.NET2002和2003中,要应用WebBrowser(浏览器)控件,得用InterOp,刚开始用的时候很正常,后来不知道为什么窗口一打开就 ...

随机推荐

  1. hdu2015

    http://acm.hdu.edu.cn/showproblem.php?pid=2015 #include<iostream> #include<stdio.h> #inc ...

  2. 查找数N二进制中1的个数(JS版 和 Java版)

    (function(){ function getOne(n) { var c = 0; for(var i = 0;i < 32;i ++){ if(((1 << i) & ...

  3. lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II

    题目: 删除排序数组中的重复数字 II 跟进“删除重复数字”: 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A=[1,1,2,2, ...

  4. DoG 、Laplacian、图像金字塔详解

    DoG(Difference of Gaussian) DoG (Difference of Gaussian)是灰度图像增强和角点检测的方法,其做法较简单,证明较复杂,具体讲解如下: Differe ...

  5. Msys 编译 VS2013 ffmpeg

    1.新版本msys2编译ffmpeg 的时候提示无法找到cl 重新安装了msys2及vs2013环境,msys2升级更新后,执行编译提示没有发现c编译器. 开始以为是新装的msys2_shell.ba ...

  6. iOS学习笔记: 使用CAShapeLayer创建带有空心区域的遮罩层

    CAShapeLayer是用来接受矢量Path,直接使用GPU来进行渲染的特殊图层.看下面效果: 对应代码: let markLayer = CAShapeLayer(); markLayer.fra ...

  7. 【转载】Java垃圾回收内存清理相关(虚拟机书第三章),GC日志的理解,CPU时间、墙钟时间的介绍

    主要看<深入理解Java虚拟机> 第三张 P84 开始是垃圾收集相关. 1. 1960年诞生于MIT的Lisp是第一门采用垃圾回收的语言. 2. 程序计数器.虚拟机栈.本地方法栈3个区域随 ...

  8. [原创]Android中LocationManager的简单使用,获取当前位置

    Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置:注册/注销来自某个 LocationProvider的周期性的位置更新:以及注册/注销接近 ...

  9. apache开源项目-- Velocity

    Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloci ...

  10. VirtualBox的工作原理&参考网上文章

    事先申明,我这里有好多东西都是看网上的,文末给出参考博客链接. 1.在设置里面为什么要选择桥接网络?baidu之后,了解到是虚拟机工作原理的不同,也就是说有好几种工作模式. bridged(桥接模式) ...