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大法。最終一個坑一個坑的趟過。實現的過程復雜,但解決問題後確是心情滿滿。點贊。