记一次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大法。最终一个坑一个坑的趟过。实现的过程复杂,但解决问题后确是心情满满。点赞。
记一次npapi插件无窗口(windowless )化下的妙巧思路然后解决问题的超爽体验过程的更多相关文章
- 一步一步学Silverlight 2系列(23):Silverlight与HTML混合之无窗口模式
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 在NPAPI开发火狐浏览器插件在NPAPI插件
1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏 ...
- 【C#】给无窗口的进程发送消息
注:本文适用.net2.0+的winform程序 一个winform程序,我希望它不能多开(但是如何防多开不是本文要讲的),那么在用户启动第二个实例的时候,作为第二个实例来说,大概可以有这么几种做法: ...
- SetTimer在无窗口和有窗口线程的使用 . .
今天犯了一个粗心的错误,在无窗口线程中,SetTimer中设置计时器ID,而WM_TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID. 对应计时器ID的输出的是一个随机数字. 原来在m ...
- 【转】NPAPI 插件无法在 Chrome 42 版及更高版本上正常运行
原文网址:https://support.google.com/chrome/answer/6213033 NPAPI 插件无法在 Chrome 42 版及更高版本上正常运行 您可以利用插件在浏览器中 ...
- Chrome浏览器扩展开发系列之十一:NPAPI插件的使用
在Chrome浏览器扩展中使用HTML和JavaScript非常容易,但是如何重用已有的非JavaScript遗留系统代码呢?答案是将NPAPI插件绑定到Chrome浏览器扩展,从而实现在Chrome ...
- 解决CPC撰写文档报错问题“无法获取“AxforApplication”控件的窗口句柄。不支持无窗口的 ActiveX 控件”
最近公司需要把官方CPC电子申请移植到项目中,在移植完成后,撰写文档总是出现“无法获取“AxforApplication”控件的窗口句柄.不支持无窗口的 ActiveX 控件”,另楼主头疼很久,网上寥 ...
- Chrome禁用NPAPI插件(包含 Silverlight、Java 和 Unity)
过去,很多插件都是使用一种称为NPAPI 的旧系统开发的. 现在,仅仅有少量站点在使用NPAPI 插件,由于这些插件有时会给站点带来安全风险. 为了让用户获得更安全.更高速且更稳定的 Chrome 浏 ...
- VC无窗口控制台程序
VC无窗口控制台程序 #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartu ...
随机推荐
- java实战之数组工具集
java是一门面向对象的语言,我们也提到过,面向对象的一个优点就在于能够提高代码的复用性,前面我们详细讲过数组的查找,排序,等等,为了提高代码的复用性,我们何不自己写一个数组的工具集,来综合下前面所学 ...
- AlgorithmsI Programming Assignment 1: Percolation
3种版本的答案,第一种使用virtual top and bottom site, 但有backwash的问题,解决这个问题有两种方法: 1. 使用2个WQUUF, 但会增加memory. One f ...
- ubuntu下新建VPN连接
1. 安装VPN Client#sudo apt-get install pptp-linux2. 安装网络管理器对VPN的支持#sudo apt-get install network-manage ...
- Linux Shell编程(5)——shell特殊字符(下)
{}代码块[花括号]. 这个结构也是一组命令代码块,事实上,它是匿名的函数.然而与一个函数所不同的,在代码块里的变量仍然能被脚本后面的代码访问. bash$ { local a; a=123 ...
- Python根据上下限生成不重复随机数
Python 2.7.5 代码: # coding=gbk import random import sys min_num = input('输入下限:') max_num = input('输入上 ...
- 转载:c++ sort用法
sort函数使用模板: sort包含在头文件algorithm中 sort(start,end,排序方法) 1.在没有排序方法时是默认从小到大的排列,例 #include<iostream> ...
- 高效算法——B 抄书 copying books,uva714
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Description ...
- [后端Day1]Python2.7之基础
注:以下内容全部为 廖雪峰的官方网站 中学习内容的摘要和总结 输入和输出: name = raw_input('please enter your name: ') print '100 + 200 ...
- Power Calculus 快速幂计算 (IDA*/打表)
原题:1374 - Power Calculus 题意: 求最少用几次乘法或除法,可以从x得到x^n.(每次只能从已经得到的数字里选择两个进行操作) 举例: x^31可以通过最少6次操作得到(5次乘, ...
- Java IO流以及装饰器模式在其上的运用
流概述 Java中,流是一种有序的字节序列,可以有任意的长度.从应用流向目的地称为输出流,从目的地流向应用称为输入流. Java的流族谱 Java的 java.io 包中囊括了整个流的家族,输出流和输 ...