Eclipse开发平台 Eclipse集成开发环境 Java技术参考 J2EE企业应用项目 J2EE开发框架整合应用
Visual Studio 2008 技术 Visual Studio 2008集成环境 LINQ SQL Server 2008数据库 Silverlight WCF WPF WWF
平台综合 开发平台技术动态 跨平台开发 软件信息技术与商业 国外媒体技术资讯
程讯网下载 精品代码 — J2EE应用下载 精品代码 — ASP.NET应用 常用J2EE开发框架 流行ASP.NET开发框架

搜索
Google
 
最新文章
对“职业生涯及规划”的一些想法与建议
 
Visual Studio 10将会怎样?
 
三十怎么了? 心态最重要!
 
访问Microsoft格式文件的Jakarta-POI API库的.NET版本
 
dashCommerce 3.X如何安装Microsoft SQL Server 2005 Express Edition的高级服务功能
 
.net 2.0运行时提示以下错误:authentication mode=Windows 解决方法如下
 
在浏览器中发贴子时实现自动添加贴子签名档的BHO对象设计
 
C#下用Browser Helper Object对象实现拦截IE浏览器的各项消息的IE插件
 
Build a Managed BHO and Plug into the Browser
 
在C#中用WM_COPYDATA消息来实现进程间通信的详细编码
 
BHO 浏览器辅助对象关联原理、编写流程
 
Oracle8i的卸载
 
Oracle9i图形工具OEM的简介
 
详细介绍整个Oracle9i软件的安装过程
 
C# 面向对象设计模式纵横谈 - 18、Iterator迭代器(行为型模式)
 
 
C#下用Browser Helper Object对象实现拦截IE浏览器的各项消息的IE插件 - .NET Framework编程 .NET开发
 
内容摘要 -


全文 -

C#下用Browser Helper Object对象实现拦截IE浏览器的各项消息的IE插件

Browser Helper Object(BHO)的机理:

想实现一个浏览器,提供一些自己的功能,但是如果用IE Control来写的话,还要自己写很多很多很多诸如:前进、后退、历史记录等等IE已经提供的功能,所以更简便的方法是给扩展、修改IE的功能,直接使用IE来实现。这方面,当然不能不提很多人深恶痛绝的3721,他提供了一个个性化的浏览器,却只写了很少的代码,其余的都是IE自带的内容。

打开一个IE,打开Spy++,再结合Internet Explorer 4.0 Architecture的图看看
 
举个例子,如果想要获取IE地址栏的内容:
IEExplorer->IEFrame->WorkerW->ReBarWindow32->ComboBoxEx32->ComboBox->Edit
这就是他的层次结构
IE和Explorer在启动新线程的时候(Explorer要看看选项里面是否选择了在新的线程中打开窗口),会检查注册表项:
[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects]
他下面有很多子项,每一个子项就是一个GUID
例如:
{06849E9F-C8D7-4D59-B87D-784B7D6BE0B3}
这个GUID对应一个BHO组件(其实就是一个COM组件)
这个组件在[HKLM\SOFTWARE\Classes\CLSID]下面进行描述,包括dll路径,签名等等信息
IE或Explorer在每个线程里会依次实例化每个在上述路径注册的BHO对象,从而BHO对象实际上运行在IE或Explorer的地址空间内,并且能够访问IE的几乎所有资源,拦截几乎所有事件,挂载自己的事件处理函数,而不需要跨进程调用和传消息。
看来完全符合最初的应用要求并且是最简单的方法了。
接下来的问题,就只剩下COM组件的使用了。.NET对COM组件的调用提供了很方便的100% pure 受控的访问方式 - Interop, Marshal。查错过程比较艰辛,因为每次重新生成都要重启Explorer.exe T T并且调试的时候,要先开IE,再下断点,再将VS .NET附加到IE进程,再点新建IE窗口...


COM组件的使用:
首先,当然是用Create GUID工具生成我们自己BHO组件的GUID({B29E305D-BC4D-4a80-B522-B0ABC9EBDFFC}),然后添加对Microsoft Internet Controls COM组件(%systemroot%\ShDocVw.dll)的引用。VS.NET会自动Wrapper之为Interop.SHDocVw.dll,值得注意的是,这里由于最后要使用BHO注册,所以要求这个COM组件必须用私钥签名,从而使用强名机制。具体步骤如下:
1、sn -k BHO.key生成Bho.key文件,也就是我们的私钥。
2、设置项目属性,ActiveX/COM对象的包装程序集->包装程序集密钥文件,指向Bho.key
3、添加COM引用(此时查看相关信息就可以看到强名选项已设为true)
4、设置AssemblyInfo.cs填写key字段,指向Bho.key
然后,就可以声明我们要继承的各项接口:
 using SHDocVw;
 #region 引入IObjectWithSite接口
 [ComImport(), Guid("fc4801a3-2ba9-11cf-a229-00aa003d7352")]
 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 public interface IObjectWithSite
 {
  void SetSite([In ,MarshalAs(UnmanagedType.IUnknown)] object site);
  void GetSite(ref Guid guid, [MarshalAs(UnmanagedType.IUnknown)] out object site);
 }
 #endregion
 #region 定义默认BHO COM接口
 [GuidAttribute("181C179B-7CC9-4457-8C1D-4B45E7C8589D")]
 [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]
 public interface IObserver
 {
 }
 #endregion
然后定义我们自己的BHO类:
 /// <summary>
 ///定义BHO类,此类由浏览器实例化
 /// <

9 7 3 1 2 3 4 4 8 :

 
相关内容
查找更多 ◇ .NET Framework编程 .NET开发