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 )化下的妙巧思路然后解决问题的超爽体验过程的更多相关文章

  1. 一步一步学Silverlight 2系列(23):Silverlight与HTML混合之无窗口模式

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  2. 在NPAPI开发火狐浏览器插件在NPAPI插件

    1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏 ...

  3. 【C#】给无窗口的进程发送消息

    注:本文适用.net2.0+的winform程序 一个winform程序,我希望它不能多开(但是如何防多开不是本文要讲的),那么在用户启动第二个实例的时候,作为第二个实例来说,大概可以有这么几种做法: ...

  4. SetTimer在无窗口和有窗口线程的使用 . .

    今天犯了一个粗心的错误,在无窗口线程中,SetTimer中设置计时器ID,而WM_TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID. 对应计时器ID的输出的是一个随机数字. 原来在m ...

  5. 【转】NPAPI 插件无法在 Chrome 42 版及更高版本上正常运行

    原文网址:https://support.google.com/chrome/answer/6213033 NPAPI 插件无法在 Chrome 42 版及更高版本上正常运行 您可以利用插件在浏览器中 ...

  6. Chrome浏览器扩展开发系列之十一:NPAPI插件的使用

    在Chrome浏览器扩展中使用HTML和JavaScript非常容易,但是如何重用已有的非JavaScript遗留系统代码呢?答案是将NPAPI插件绑定到Chrome浏览器扩展,从而实现在Chrome ...

  7. 解决CPC撰写文档报错问题“无法获取“AxforApplication”控件的窗口句柄。不支持无窗口的 ActiveX 控件”

    最近公司需要把官方CPC电子申请移植到项目中,在移植完成后,撰写文档总是出现“无法获取“AxforApplication”控件的窗口句柄.不支持无窗口的 ActiveX 控件”,另楼主头疼很久,网上寥 ...

  8. Chrome禁用NPAPI插件(包含 Silverlight、Java 和 Unity)

    过去,很多插件都是使用一种称为NPAPI 的旧系统开发的. 现在,仅仅有少量站点在使用NPAPI 插件,由于这些插件有时会给站点带来安全风险. 为了让用户获得更安全.更高速且更稳定的 Chrome 浏 ...

  9. VC无窗口控制台程序

    VC无窗口控制台程序 #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartu ...

随机推荐

  1. "Redis客户端连接数一直降不下来"的有关问题解决

    [线上问题] "Redis客户端连接数一直降不下来"的问题解决 前段时间,上线了新的 Redis缓存(Cache)服务,准备替换掉 Memcached. 为什么要将 Memcach ...

  2. MySQL使用rand函数实现随机数

    sql 的随机函数newID()和RAND() sql server的随机函数newID()和RAND() SELECT * FROM Northwind..Orders ORDER BY NEWID ...

  3. Balance(01背包)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9163   Accepted: 5617 Description Gigel ...

  4. LA 4726 再看斜率优化

    感觉最近一批解题报告没写,现在慢慢补吧,算是noip前攒攒rp了 首先感到深深的自责,因为之前对斜率优化没有深入的理解,只是记住了一般步骤,并没有完全了解为什么这样做 先就这道题目而言 首先这种序列题 ...

  5. ACM第六周竞赛题目——A LightOJ 1317

    A - A Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status P ...

  6. android网络图片的下载

    android网络图片的下载 /** * Get image from newwork * * @param path * The path of image * @return byte[] * @ ...

  7. [AS/400] 基本概念

    本文内容源于 Go4AS400 在 AS/400 中,AS 代表着 Application System.AS/400 是一个安全性高的系统,可以限制用户只能访问.处理特定的信息.AS/400 整合了 ...

  8. 第一个嵌入汇编的C程序

    最近两天开始学习linux内核,看了赵炯博士的<linux内核完全注释>感觉受益匪浅.今天看到第三章 嵌入汇编部分,于是写了一个小程序试验了一下,用gcc编译通过.代码如下: #inclu ...

  9. errno与perror

    很多系统函数在错误返回时将错误原因记录在libc定义的全局变量errno中,每种错误原因对应一个错误码,请查阅errno(3)的Man Page了解各种错误码,errno在头文件errno.h中声明, ...

  10. redis学习心得之一【安装redis初体验】

    在linux下安装redis 说起这个比mysql的安装过程简单多乐,它不需要configure,只需要解压之后make就可以,无需make install ~$ wget http://redis. ...