给Webkit内核的浏览器控件增加互交功能

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

 

    昨天封装了基于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语句:

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

    这样就动态得让id为navig_01_的元素的onclick事件绑定到test()函数,而test函数里可以再调用c++的函数,实现了c++绑定到网页的元素的事件。还有很多功能都可以使用我介绍的这两种方法来实现,我就不一一介绍了,大家自己使用吧。

    通过这篇日志可以看到,wke使用起来很简单,也很方便,只需要少量代码就可以实现c++与webkit内核的互交。

    贴一张效果图 

wke浏览器源码地址:http://blog.csdn.net/zhuhongshu/article/details/40740353

2014.7.26 15:04  Redrain 

时间: 2024-11-02 11:25:15

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

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

转载请说明原出处,谢谢~~        前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布.其实这个控件封装起来没什么难度,我只是按照原来作者的demo,把相应的消息封装成duilib对应的.        在此首先要感谢wke内核的作者BlzFans以及soui2界面库的作者flyhigh,BlzFans精简了webkit内核后封装为wke并公布了源码,flyhigh对wke进行处理让他更容易移植到du

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

转载请说明出处,谢谢~~          原本的duilib是自带浏览器控件的,但是使用了IE内核,我在做仿酷狗音乐播放器时,在右侧乐库要用到浏览器控件,而我使用自带的IE控件却发现了不少缺点,这也是duilib一直没有解决的,编程群里的朋友也反映IE控件不好用.而目前最常用的浏览器内核一个是IE内核,另一个是webkit内核.             先简单介绍一下这个webkit内核            WebKit 是一个开源的浏览器引擎,与之相对应的引擎有Gecko(Mozilla

c#-C# 用除了webbrowser的浏览器控件获取Html元素并转化成相应对象。

问题描述 C# 用除了webbrowser的浏览器控件获取Html元素并转化成相应对象. C# 用除了webbrowser的浏览器(如webkit,Cefsharp,cefglue)控件获取 img Html元素并转化成对应的Image对象 解决方案 最简单通用的做法是借助剪贴板.不管什么内核,只要你的浏览器支持选中和复制,也不管什么格式,C#那里都可以获得. "通过httpwebrequest对象发起请求获取到html",我猜测lz要得到验证码,如果是那样,再发请求会导致验证码刷新.

open-webkit-sharp的webKitBrowser浏览器控件,如何实现js脚本调用c#的方法

问题描述 如题,我用WebKit.NET的封装接口软件open-webkit-sharp,在c#的WinForm窗体内嵌入webKitBrowser浏览器控件,在webKitBrowser内打开htm的页面,页面上内有按钮,我想点击按钮时,用js脚本调用c#的方法函数.若使用c#自带的WebBroeser控件内,在htm页面用js脚本调用c#的方法函数,用window.external可正常调用c#的方法函数.但open-webkit-sharp的webKitBrowser内,window.ex

将 Java 小程序迁移到 Microsoft J# 浏览器控件

程序|控件|浏览器 Visual J# .NET 小组 Microsoft Corporation 摘要:通过 Microsoft J# 浏览器控件,开发人员可以将所编写的在 Java 虚拟机上运行的 Java 小程序迁移到 .NET 框架.本文向开发人员介绍 J# 浏览器控件,并说明将 Java 小程序迁移到 .NET 框架的步骤.本文还讨论了其他一些主题,如 J# 浏览器控件的安全性和调试,以及当前版本中不受支持的功能. 下载 HTML 小程序到对象标记转换器 (95KB) 本文假设开发人员

Win8系统无法打开网页提示”浏览器控件不兼容“解决办法

  Win8系统无法打开网页提示"浏览器控件不兼容"解决办法: 1.进入Win8系统,然后,使用鼠标双击要浏览的图标即可将浏览器打开; 2.在Win8系统窗口右上角处,点击工具按钮,再选择"Internet选项",接着在窗口上点击高级选项卡; 3.在Win8系统窗口高级选项卡下,点击"启动增强保护模式",然后使用鼠标将选英方框内的勾取消掉,并在窗口右下角点击"确定"按钮保存,即可解决浏览器无法显示故障; 4.返回Win8系统浏

求教一个浏览器控件的问题,谢谢

问题描述 浏览器控件打开网页时,会有两个动作1.获取内容到本地,2.如果里面有自动get或post,会有数据提交出去我想实现一个事就是,这个控件在获取内容到本地时,用本地网络get或者post数据出去时,采用代理ip可行吗?

java swing给控件增加快捷键

如何给swing 控件增加快捷键呢? 场景:  当光标聚焦在password 文本框时,按Alt+Enter键,使username文本框聚焦.如何实现呢? Java代码   /***       * 按Alt+Enter时,用户名文本框聚焦       * @param tf :密码输入框       */       private void addKeyListener22(JTextField tf){           tf.addKeyListener(new KeyListener

VBasic 给菜单控件增加快捷键

问题描述 VBasic 给菜单控件增加快捷键 怎么利用VBasic语言给菜单控件增加快捷键,就像word一样按一个组合可以调出命令来? 解决方案 http://www.cnblogs.com/EnCaL/articles/2417343.html 解决方案二: Silverlight菜单控件 - CurveMenu