關於軟件設計人員開發瀏覽器插件技術都是保密的,這類的計算機學術內容是不多的,早期的程序員都是本身摸索,要走許多彎路。 程序員
從當今瀏覽器插件開發來看,谷歌瀏覽器走在前沿,谷歌內部開發者善於使用JavaScript語言豐富其瀏覽器插件內容。谷歌開發者文檔也是開源的。 編程
這裏談談微軟公司如何開發瀏覽器插件,不過遺憾的是微軟官方網站已經不能訪問,編程語言是c#,固然也可使用c+,最好vc+。 c#
C#明顯要比C++強大不少. 例如C#提供的FOREACH 循環就能夠避免FOR循環產生的溢出. 另外C#的類型轉換也明顯要強於C++. 畢竟BHO和C#都是出自微軟一家, 理所固然, C#更適合BHO開發一些. 瀏覽器
用C#搭建 BHO勾子,BHO''''即英文''Browser Helper Object 的縮寫'',經過它,擴展插件。'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 編程語言
now,咱們須要在C#中新建一個DLL工程. 由於BHO是經過讓IE調用DLL來驅動的. 我用的是V C# EXPRESS. 由於這已經徹底夠用了. 集成開發環境visual studio 2010,圖 ide
當咱們創建一個空工程之後, 隨便添加一個文件夾叫BHO, 而後添加一個文件. next, 函數
須要咱們注意的是, 咱們這個文件必須被命名爲IObjectWithSite.cs由於這樣IE才知道這是一個BHO程序. 若是想知道更多關於IObjectWiteSite接口的內容, 請查詢MSDN 網站
http://msdn2.microsoft.com/en-us/library/Aa768220.aspx ui
在IObjectWithSite中必須有兩個方法GetSite和SetSite. 咱們主要是對後者進行調用.經過名字你們就能夠猜到他們是幹什麼的. spa
GetSite: Gets the last site set with IObjectWithSite::SetSite. If there is no known site, the object returns a failure code.
SetSite: Provides the site's IUnknown pointer to the object.
請把VS STUIDO 默認的類名給去掉.由於IObjectWithSite並非一個類, 而是一個接口.
記得添加 System.Runtime.InteropServices
下面咱們再添加劑一個叫BHO.CS的主文件.
爲了使用微軟的BHO庫.咱們必須添加下面兩個庫: SHDocVw and MSHTML.他們通常都在 Windows\System32 下面
SHDocVw is Microsoft Shell Doc Object and Control Library
MSHTML is: All interfaces for accessing the Dynamic HTML (DHTML) Object Model are based on IDispatch and are the basis of access to the object model that is also used by scripts. http://msdn2.microsoft.com/en-us/library/bb498651.aspx
Add SHDocVw
由於稍後咱們須要用到MESSAGEBOX, 因此這裏我也添加了一個WINDOWS FORM庫.
下面添加兩個變量: WebBrowser and HTMLDocument. 就如同他們的名字. 一個是IE的變量, 另一個是IE所訪問的HTML頁變量.
下面在這個類中田間一個叫 OnDocumentComplete 的函數. 取其餘名字也行, 沒什麼太大關係. 可是這裏爲了CODE的可用性,咱們叫OnDocumentComplete. 這個函數其實是和CDHTMLDIALOG下面的OnDocumentComplete所對應的.
CDHtmlDialog Class http://msdn2.microsoft.com/en-us/library/8bed8k60(VS.80).aspx .
OnDocumentComplete的觸發是在一個HTML頁被LOAD完之後. 你也能夠避免用Navigate() or OnBeforeNavigate(). 他們表示在發出訪問和訪問以前觸發.
Please refer to http://msdn2.microsoft.com/en-us/library/8k5z3ekh(VS.80).aspx to find out what you need exactly.代碼以下:
在 IObjectWithSite.cs下,你須要支出IE的GUID, 這樣才方便註冊表的更改
另外你須要給本身的程序添加一個GUID. 這樣IE才能在註冊表中找到你的信息. 你可使用System.Guid.NewGuid() method 來獲得一個GUID. 這比C++獲得GUID的方法要容易得多了.
咱們必須給 SetSite and GetSite 加上內容. 在SETSITE中咱們就須要加入一個EVENTHANDLER, 讓IE來觸發咱們的OnDocumentComplete函數.
最後編譯, 咱們就有了咱們的DLL,
OK,成功,
打開註冊表, 找到Browser Helper Object under LOCAL_MACHINE->SOFTWARE->MICROSOFT->WINDOWS->EXPLORER, 看看是否是有變化了?
咱們註冊完了, 下面就是來寫咱們的住程序來控制IE了. 下面就是一個例子來抓去你正訪問的頁面上的全部INPUT 元素的NAME.
在DOCUMENT中, 咱們的全部元素都爲IHTMLElement, 咱們須要調用的是IHTMLInputElement. 因此咱們經過GetElementByTagName的方法來查找全部的INPUT ELEMENT. 在找到之後還須要進行類型轉換才能找到對應的ATTRIBUTE. 不然IHTMLElement是不代有NAME ATTRIBUTE的. IHTMLElement提供的ATTRIBUTE都是全部元素都有的. 例如ID, 例如TITLE, 例如OnClick等. 有的元素有本身特有的ATTRIBUTE, 例如INPUT有OnFocus這就必需要轉換成IHTMLInputElement才能上使用. INPUT對應的IHTMLInputElement, Select-> IHTMLSelectElement .......
下面咱們試另一個方法叫 BeforeNavigate() .它的觸發是在你開始下一個頁面以前. 也就是說例如你要提交一個表單, 頁面要變化了, 他就被觸發.實際上MS提供了兩個相似的接口 BeforeNavigate and BeforeNavigate2().
瀏覽器插件開發完成。
end