记一次npapi插件无窗口(windowless )化下的妙巧思路然后解决有关问题的超爽体验过程
1:问题
集成第三方的ocx控件,用来做pdf显示和签名。如果用窗口化插件做,很简单,加载ocx到窗口中,再显示到网页即可。但这样有个缺点。就是这个窗口会浮动在网页元素的上面,导致遮挡住网页元素。比如网页弹出层,下拉框等。
2:解决问题思路
Npapi无窗口(windowless)插件的句柄只是一个HDC,只能把需要展示的东西画在这个HDC上输出。那么就想到如下方式:
1:创建一个窗口,窗口加载ocx控件,隐藏此窗口,在插件的HandleEvent(windowless)中的事件处理中,刷新消息里实时根据ocx窗口句柄进行截图(bmp格式),然后在位图通过HDC输出到界面。看似解决了,打完收工。
但是,但是。。。。。。。。这种方式导致鼠标事件无法在ocx窗口进行。因为无窗口插件就是一个HDC,所有鼠标事件都在上面发生,通过在handlevent中转发鼠标的消息到ocx窗口也无效。导致缩少放大,拖动pdf文件等无效,极度影响体验,又要无窗口化,又要完美支持,真是两难,进度一度停止不前。
3.转机
话又要说回来,因为自已以前经常搞点逆向的小工程,虽然技术很菜,但看过别人怎么玩,也就是这点基础,让想到了类似QQ密码等的捕获技术所使用的方法。那就是:在QQ密码框上弄一个看不见的遮罩层,用户在输入密码时,这个遮罩层也在响应相应的消息,从来轻松兼容所有问题。一个激灵,让事情有了转机。
4:要实现此种方法的技术难点在
1) 窗口跟随,也就是取到目标窗口的的句柄,跟踪目标窗口,通过句俩获得目标窗口的座标,让遮罩层跟随过去。Npapi无窗口插件无句柄,是一个hdc。难!
2) Npapi插件相对浏览器和屏幕的座标。
3) Npapi插件本身大网页中的座标和大小。
4) Npapi在鼠标移出时,需让遮罩层移出屏幕或隐藏,否则又回到最开始说了,会浮动在网页元素最顶层,虽然看不见。但影响网页元素的操作,因为鼠标消息都被它截获了。
5) 多浏览器下的座标换算
6) 单网页下多插件的座标换算和句柄等操作。
7) 其它若干小坑。。。。
结局:
通过baidu大法和google大法。最终一个坑一个坑的趟过。实现的过程复杂,但解决问题后确是心情满满。点赞。