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

昨天封装了基于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. JS创建对象

    本人常用的创建对象的方式,仅供参考,欢迎吐槽,谢谢! 创建对象1.对象字面量,即使用大括号,如下: (function(){ var obj = { id: 1, desc: '创建对象测试开始啦!' ...

  2. 欧拉工程第68题:Magic 5-gon ring

    题目链接 任意一条线上的三个数的和都等于9,顺时针,从最小的外圈开始,得到的序列是:432621213 和             序列 9位的字符串:三角环所能形成的最大字符串为432621513. ...

  3. asp.net如何设置数据库连接池的数量

    http://www.cnblogs.com/wbcms/archive/2008/10/11/1308725.html 可以使用一组名称-值对以链接字符串的形式配置链接池.例如,可以配置池是否有效( ...

  4. 常用的Linux终端

    常用的Linux终端 gnome-terminal (Gnome标配) xfce4-terminal (XFCE4标配) lxterminal (LXDE标配) konsole (KDE标配) 前面3 ...

  5. hdu 1176 免费馅饼(nyist 613)

    http://acm.hdu.edu.cn/showproblem.php?pid=1176 dp[i][j]:表示第i秒接j位置的馅饼的最大值. 三种状态: dp[i][j]=max(dp[i-1] ...

  6. Android的底层库libutils介绍

    第一部分 libutils概述 libutils是Android的底层库,这个库以C++实现,它提供的API也是C++的.Android的层次的C语言程序和库,大都基于libutils开发. libu ...

  7. oracle db shutdown immediate–multi Instance

    [oracle@redhat4 ~]$ sqlplus / as sysdba@orcl SQL*Plus: Release 11.2.0.1.0 Production on Tue Oct 6 21 ...

  8. WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)

    好久没有写文章,发一篇顶顶博客访问量.别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么..流量该多少就多少吧... 回到主题,在webbrowser中点击某链接网上几乎都 ...

  9. Git for windows 中文乱码解决方案

    1.git status时显示乱码,如下: \316\304\261\276\316\304\265\265.txt 解决方案: $ git config --global core.quotepat ...

  10. git for windows+TortoiseGit客户端的使用

        一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 : https://code.google.com/p/msysgit/downloads/list?q=full+instal ...