在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方法即可。
好啦,新的示例主要就这些内容了,处理输入事件的流程应该也清楚了。
这次实验的东西比较奇特,不走寻常路,仅仅是为了兼容老代码……