在尋找插件開(kāi)發(fā)資料的過(guò)程中找到了一個(gè)開(kāi)發(fā)瀏覽器插件的開(kāi)源項(xiàng)目——firebreath。參考:firebreath主頁(yè)。根據(jù)其介紹可以實(shí)現(xiàn)各種瀏覽器插件的開(kāi)發(fā)。于是我進(jìn)行了嘗試,并試圖搜索利用firebreath開(kāi)發(fā)插件的中文資料。搜索到的相關(guān)中文資料有一個(gè):徐凡的博客。其中有使用firebreath開(kāi)發(fā)瀏覽器插件(一、二、三)三篇關(guān)于firebreath開(kāi)發(fā)插件的文章。看完了,但是還是不怎么會(huì)。

經(jīng)過(guò)兩周的摸索,基本上掌握了用firebreath開(kāi)發(fā)插件的初步流程,但是沒(méi)法熟練運(yùn)用。主要根據(jù)firebreath上的getting started進(jìn)行,這里記錄一下用firebreath開(kāi)發(fā)插件的基本流程(開(kāi)發(fā)環(huán)境我用的是VS2010中文旗艦版)。

準(zhǔn)備工作

要使用firebreath來(lái)開(kāi)發(fā)插件,需要下載以下東西:firebreath的源代碼、python、CMake。安裝python(可以是2.5 2.6 2.7版本,我下載的是2.7版本),注意python最好安裝在firebreath的工程目錄中。安裝CMake(我下載的最新版本),注意安裝過(guò)程中請(qǐng)選擇添加到環(huán)境變量。Firebreath源代碼可以在github上簽出(需要安裝git bash),也可以直接下載壓縮包文件,我直接下載zip程序包,firebreath 1.6 zip包下載地址
下面是詳細(xì)步驟,將源代碼下載下來(lái)之后解壓到:D:\Users\zcf\Documents\My Program\2012\FireBreath\中。我將python安裝在D:\Users\zcf\Documents\My Program\2012\FireBreath\Python27\注意即使不安裝在firebreath目錄也 不要安裝在目錄路徑有特殊字符(特別是空格)的路徑下,與firebreath文件夾的相對(duì)路徑?jīng)]有空格也行。

創(chuàng)建新的plugin

運(yùn)行cmd(win7請(qǐng)以管理員身份運(yùn)行)。
轉(zhuǎn)到firebreath的根目錄下:
cd /d D:\Users\zcf\Documents\My Program\2012\FireBreath
運(yùn)行fbgen.py
Python27\python.exe fbgen.py
運(yùn)行到此截圖:

輸入需要輸入的東西
 

完成之后在firebreath根目錄下會(huì)產(chǎn)生一個(gè)projects文件夾,里面就是剛剛建立的工程的源文件了。這些文件在firebreath的網(wǎng)站上有詳細(xì)介紹,看得很模糊,我就不羅嗦了,需要看的自己去看原文說(shuō)明吧。

創(chuàng)建工程

還是在剛才那個(gè)cmd窗口中運(yùn)行prep2010.cmd,如下圖:

我使用VS2010來(lái)開(kāi)發(fā),因此運(yùn)行prep2010.cmd、如果你使用其他版本請(qǐng)使用相應(yīng)的prep文件。另外,如果需要?jiǎng)?chuàng)建給出的兩個(gè)例子,則可以運(yùn)行prep2010.cmd examples。

運(yùn)行完畢就創(chuàng)建好工程了,在firebreath根目錄下的build文件夾下面會(huì)生成很多文件,其中有一個(gè)FireBreath.sln就是我們熟悉的VS解決方案文件了。雙擊這個(gè)文件就可以用VS打開(kāi)這個(gè)解決方案了。如下圖:

最后一個(gè)項(xiàng)目就是我們建立的項(xiàng)目,其他的是自己生成的。當(dāng)我們新建第二個(gè)plugin時(shí)就會(huì)在這個(gè)之后再添加一個(gè)項(xiàng)目吧!(不過(guò)我還沒(méi)試過(guò))。
 
接下來(lái)就在VS中生成解決方案。整個(gè)過(guò)程完成之后就會(huì)在~FireBreath\build\bin\demo\Debug\下面找到npdemo.dll,這就是我們生成的plugin了。在~FireBreath\build\projects\demo\gen\目錄下可以找到FBControl.htm文件,這個(gè)文件就是我們這個(gè)plugin的測(cè)試頁(yè)面了,當(dāng)然你也可以自己編寫(xiě)測(cè)試頁(yè)面。
將產(chǎn)生的npdemo.dll復(fù)制到用來(lái)測(cè)試的Firefox profile文件中plugins目錄(沒(méi)有的話(huà)自己新建吧)下,然后用這個(gè)profile運(yùn)行Firefox,打開(kāi)FBControl.htm文件。如下圖:(也可以采用其他方式注冊(cè)plugin,請(qǐng)參考相關(guān)資料)

點(diǎn)擊確定之后:
 

這樣這個(gè)plugin就創(chuàng)建完畢了,還沒(méi)看明白呢,就結(jié)束了?太快了吧。。。
 
我剛開(kāi)始建立完就是這個(gè)感覺(jué):我可以創(chuàng)建plugin了,可是我感覺(jué)我又什么都不會(huì)。一般的有關(guān)創(chuàng)建plugin的說(shuō)明都是到這個(gè)地方就結(jié)束了,給我的感覺(jué)就是還沒(méi)開(kāi)始就結(jié)束了。。。

實(shí)現(xiàn)一個(gè)簡(jiǎn)單的功能

其實(shí)上面這個(gè)例子已經(jīng)實(shí)現(xiàn)了很多比較實(shí)用的功能了,可是我比較菜,只能看懂一小部分。我想實(shí)現(xiàn)一個(gè)用鼠標(biāo)在plugin窗口上畫(huà)線(xiàn)的功能。經(jīng)過(guò)摸索,終于可以實(shí)現(xiàn)我想實(shí)現(xiàn)的這個(gè)功能了。下面是我的步驟:
看程序的過(guò)程中我發(fā)現(xiàn)已經(jīng)實(shí)現(xiàn)了鼠標(biāo)按下,抬起,移動(dòng)等事件的函數(shù),但是函數(shù)體只有一個(gè)return語(yǔ)句,下圖是所有已經(jīng)實(shí)現(xiàn)的函數(shù):

看到這些函數(shù),我想畫(huà)線(xiàn)的函數(shù)就可以利用這三個(gè)鼠標(biāo)事件來(lái)來(lái)完成吧。于是我做了如下工作。
 
1,定義幾個(gè)私有成員變量(demo.h文件中):

2,在構(gòu)造函數(shù)中初始化一下(demo.cpp文件中):
 

3,先寫(xiě)onMouseDown和onMouseUp兩個(gè)函數(shù)中的代碼(作用:修改鼠標(biāo)是否按下的狀態(tài))。如下圖,框住的是添加的內(nèi)容:
 

4,再來(lái)寫(xiě)鼠標(biāo)移動(dòng)時(shí)實(shí)現(xiàn)的功能,首先獲取鼠標(biāo)指針?biāo)诘狞c(diǎn),與前面一樣:m_mousePosXnew=evt->m_x; m_mousePosYnew=evt->m_y;就搞定了;然后就是畫(huà)線(xiàn)的功能了(如果你對(duì)windows編程很熟悉就直接看后面的程序截圖吧,因?yàn)槲也皇煜ぃ晕覍⑦@個(gè)過(guò)程描述得詳細(xì)一點(diǎn),請(qǐng)理解),從old 的點(diǎn)畫(huà)到new這個(gè)點(diǎn)。我雖然對(duì)windows程序開(kāi)發(fā)不是很熟練,但是還是知道有個(gè)LineTo的函數(shù),因此先就假設(shè)是LineTo(old,new)吧。于是就接下來(lái)寫(xiě):

if (b_isDown)
{
LineTo(old, new);
}
最后,將new這一點(diǎn)保存為old的點(diǎn): 
m_mousePosXold= m_mousePosXnew; m_mousePosYold= m_mousePosYnew;
所以這里就剩下搞清楚 LineTo這個(gè)函數(shù)了,要實(shí)現(xiàn)從一個(gè)點(diǎn)畫(huà)線(xiàn)到另一個(gè)點(diǎn)在windows中其實(shí)是這樣實(shí)現(xiàn)的:
HDC hDC;
hDC=GetDC(hWnd);
MoveToEx(hDC,m_mousePosXold,m_mousePosYold,NULL);
LineTo(hDC,m_mousePosXnew,m_mousePosYnew);
ReleaseDC(hWnd,hDC);
上面這樣實(shí)現(xiàn)了,要使用HDC以及MoveToEx和LineTo需要包含頭文件PluginWindowWin.h。還差個(gè)HWND,如何得到這個(gè)HWND,我也說(shuō)不清楚,我是看到例子FBTestPlugin中的代碼才知道可以這樣獲取的:FB::PluginWindowWin *wnd = dynamic_cast<FB::PluginWindowWin*>(win); HWND hWnd=wnd->getHWND();下面是FBTestPlugin 的FBTestPlugin.cpp文件中的代碼片段截圖:

經(jīng)過(guò)嘗試,終于完成了我想要實(shí)現(xiàn)的這個(gè)簡(jiǎn)單功能,再次感慨一下開(kāi)發(fā)plugin對(duì)windows編程的基礎(chǔ)能力還是有相當(dāng)需求的。下面是完整的onMouseMove函數(shù)代碼截圖,框住的是添加的內(nèi)容(注意在文件最前面添加頭文件的引用#include "PluginWindowWin.h"):


做完這些修改之后,在demo這個(gè)項(xiàng)目上選擇僅用于項(xiàng)目->僅重新生成demo。等生成完畢之后,去前面的位置找到npdemo.dll復(fù)制到Firefox相應(yīng)profile下的plugins目錄,重新啟動(dòng)Firefox,打開(kāi)那個(gè)測(cè)試頁(yè)面。

下面是運(yùn)行效果,請(qǐng)忍受我的涂鴉,\(^o^)/~

差不多了吧,這個(gè)簡(jiǎn)單的功能就這樣了。或許再添加一個(gè)鼠標(biāo)移出區(qū)域的事件,在其中將鼠標(biāo)按下?tīng)顟B(tài)設(shè)為false會(huì)更好。
 
我做插件的目的是要播放瀏覽器不支持的媒體文件,我會(huì)繼續(xù)慢慢研究,希望研究插件開(kāi)發(fā)的能一起共同交流,交流群:81424441。
 

http://www.firebreath.org/display/documentation/FireBreath+Home