浅析浏览器插件技术---c#篇

    关于软件设计人员开发浏览器插件技术都是保密的,这类的计算机学术内容是不多的,早期的程序员都是本身摸索,要走许多弯路。 程序员

   从当今浏览器插件开发来看,谷歌浏览器走在前沿,谷歌内部开发者善于使用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

相关文章
相关标签/搜索