快捷搜索: 王者荣耀 脱发

在PPAPI插件中创建本地窗口

实验了一个比较奇特的东西,在PPAPI插件里创建一个本地窗口,叠加在插件在网页的位置上。

CEF3默认是多进程架构,PPAPI插件在一个单独进程里跑,这个进程没启动Windows的消息循环,所以,要创建插件的话,得自己搞一个消息循环。另外浏览器窗口属于别的进程,怎么把创建出来的窗口成为浏览器窗口的子窗口,也是个问题。这个第一个要解决的问题。

CEF3还支持单进程运行,Browser、Render、Plugin合一,此时创建本地窗口又和多进程不同。这是第二个问题。

第三个问题是,如何把窗口定位到网页的插件区域。

琢磨了下,都解决了。

效果

灰色区域那里是我创建的本地窗口,上面有一行字。

再看同一进程的:

注意文字的变化。

代码

Talk is cheap,show me the code:

工程和原来差不多,不说了。

代码基于改造,添加的部分,在注释处加入了foruok标签,搜索即可查看。下面说明几点。

本地窗口的创建

CreateChildWindow()函数是创建本地窗口的入口函数,它利用进程id,判断了插件进程与浏览器进程是否同一进程。

如果是同一进程,通过调用PPB_Core的CallOnMainThread方法,在主线程执行CreateChildWindowOnMainThread来创建子窗口。

窗口定位

DidChangeView方法之前在里提到过,当插件和浏览器的视图关联起来或者视图发生变化时,DidChangeView方法会被调用。这次我们就在这里创建窗口。窗口的位置,可以通过PPB_View接口的GetRect()方法获取到。这个位置就是我们要创建的本地窗口的位置,传递给CreateWindowEx方法即可。

好啦,新的示例主要就这些内容了,处理输入事件的流程应该也清楚了。


这次实验的东西比较奇特,不走寻常路,仅仅是为了兼容老代码……

经验分享 程序员 微信小程序 职场和发展