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. Bull And Cows

    package cn.edu.xidian.sselab.hashtable; import java.util.HashMap;import java.util.Map;import java.ut ...

  2. RR 插入不影响

    | test100 | CREATE TABLE `test100` ( `sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号', `phoneNo` ...

  3. 离奇“undefined reference”错误分析与解决方案

    离奇“undefined reference”错误分析与解决方案 “undefined reference to XXX”是一类挺常见的链接错误,原因通常是链接时找不到声明成extern类型的函数的定 ...

  4. Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

    目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps ...

  5. Codeforces 715B & 716D Complete The Graph 【最短路】 (Codeforces Round #372 (Div. 2))

    B. Complete The Graph time limit per test 4 seconds memory limit per test 256 megabytes input standa ...

  6. 自己做的网页页面导航浏览JS/JQuery_版本2(优化边缘)

    版本2增加了宽宽的边界,边界内鼠标也可以导航.边界对应这HTML页面的边界.目前右下角有时会导致功能失效.版本1. 这次找了个更好的例子,实践中产生这个需求的真实例子,点我Demo. 需求: 版本1: ...

  7. iOS开发ARC入门和使用

    本文引自:http://www.onevcat.com/2012/06/arc-hand-by-hand/ 英文原版:http://www.raywenderlich.com/5677/beginni ...

  8. SRM 597

    我果然是题短了就能做得好- -.Div 2的三道题都短,于是迅速的过掉了250和500,rating涨了150^ ^. Div 2 250pt 题意:给一个vector<int> A,对其 ...

  9. servlet简介

    web 开发分为两种:静态开发(使用html)和动态开发(使用servlet/jsp,jsp就是servlet,ASP ,PHP) 所以servlet是sun公司提供的一门专门用于开发动态web资源的 ...

  10. 实时控制软件第一次作业--CNC软件系统分析

    作者:李君威U201310747 一.该系统有哪些强实时功能需求?需要对哪些实时事件进行实时响应,对允许的实时延迟的数量级进行估计. 答:在数控系统中,位置控制.插补计算.紧急控制等严格实时性任务需要 ...