程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 記一次npapi插件無窗口(windowless )化下的妙巧思路然後解決問題的超爽體驗過程,npapiwindowless

記一次npapi插件無窗口(windowless )化下的妙巧思路然後解決問題的超爽體驗過程,npapiwindowless

編輯:C++入門知識

記一次npapi插件無窗口(windowless )化下的妙巧思路然後解決問題的超爽體驗過程,npapiwindowless


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved