一丶接口IObjectWithSite

  1. //BHO项目(类库)添加引用两个COM
  2. //Microsoft HTML Object Library, Microsoft Internet Controls;
  3.  
  4. using System.Runtime.InteropServices;
  5.  
  6. namespace TestBho
  7. {
  8. [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
  9. public interface IObjectWithSite
  10. {
  11. [PreserveSig]
  12. int SetSite([MarshalAs(UnmanagedType.IUnknown)]object site);
  13. [PreserveSig]
  14. int GetSite(ref Guid guid, out IntPtr ppvSite);
  15. }
  16. }

二丶实现接口IObjectWithSite

  1. using Microsoft.Win32;
  2. using mshtml;
  3. using SHDocVw;
  4.  
  5. namespace TestBho
  6. {
  7. //每开启IE浏览器器选项页都会创建一个MyBho类的实例来对应IE选项页
  8. //IE8 是每个Tab 一个独立进程,当IE的Tab进程被创建的时候,都会创建一个MyBho类的实例
  9. [ComVisible(true),Guid("8a194578-81ea-4850-9911-13ba2d71efbd"),ClassInterface(ClassInterfaceType.None)]
  10. public class MyBHO : IObjectWithSite
  11. {
  12. InternetExplorer ie;
  13. List<string> logs = new List<string>();
  14. public int SetSite(object site)
  15. {
    // ie进程创建,则创建BHO并ie进程以参数site传入,关闭ie进程将Null以参数site传入
  16. if (site != null)
  17. {
  18. ie = (InternetExplorer)site;
  19. logs.Add("BHO构建");
  20. ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
  21. }
  22. else
  23. {
  24. ie.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
  25. }
  26. return 0;
  27. }
  28.  
  29. private void ie_DocumentComplete(object pDisp, ref object URL)
  30. {
  31. if (URL.ToString().StartsWith("http://192.168.1.1:8000/"))
  32. {
  33. logs.Add(URL.ToString());
  34. logs.Add("-----------------------------------------");
  35. logs.Add(ie.LocationURL); //ie地址栏的url
  36. logs.Add(ie.LocationName); //ie标题或选项项标题
  37. logs.Add(ie.Name); //ie应用的名称
  38. logs.Add("-----------------------------------------");
  39. }
  40. }
  41.  
  42. public int GetSite(ref Guid guid, out IntPtr ppvSite)
  43. {
  44. IntPtr punk = Marshal.GetIUnknownForObject(ie);
  45. int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
  46. Marshal.Release(punk);
  47. return hr;
  48. }
  49.  
  50. #region 注册Bho
  51. public static string key = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";
  52. [ComRegisterFunction]
  53. public static void RegisterBHO(Type type)
  54. {
  55. RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(key, true);
  56.  
  57. if (registryKey == null)
  58. registryKey = Registry.LocalMachine.CreateSubKey(key);
  59.  
  60. string guid = type.GUID.ToString("B"); //当前类的GUID字符串(注意:不是接口GUID)
  61. RegistryKey ourKey = registryKey.OpenSubKey(guid);
  62.  
  63. if (ourKey == null)
  64. ourKey = registryKey.CreateSubKey(guid);
  65.  
  66. registryKey.Close();
  67. ourKey.Close();
  68. }
  69.  
  70. [ComUnregisterFunction]
  71. public static void UnregisterBHO(Type type)
  72. {
  73. RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(key, true);
  74. string guid = type.GUID.ToString("B"); //当前类的GUID字符串(注意:不是接口GUID)
  75.  
  76. if (registryKey != null)
  77. registryKey.DeleteSubKey(guid, false);
  78. }
  79. #endregion
  80. }

三、安装与卸载BHO

  1. Regasm.exe MyBHO.dll /codebase
  2. //注册BHO,将安装到ie中,通过ie【管理加载项】管理BHO
  3. Regasm.exe MyBHO.dll /unregister //卸载BHO
  4. Regasm.exe /c MyBHO.dll //注册BHO,将安装到ie中,通过ie【管理加载项】管理BHO
  5. Regasm.exe /u MyBHO.dll //卸载BHO

补充说明

在win7以上操作系统,当BHO写访问本地磁盘时,BHO写访问失败(Try捕获出现异常,可看到异常信息),这是由于win7操作系统提高了安全等级所致。 但BHO还是可以写访问″C:\Users\[操作系统当前用户名]\″ (获取当前用户文件夹∶ Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)), 但其实写访问的是″C:\Users\[操作系统当前用户名]\AppData\Local\Microsoft\Windows\INetCache\Virtualized\C\Users\[操作系统当前用户名]″,具体的原因请查阅"Win7或IE7安全特性"。
 
四、BHO更改网页内容
  1. //每开启IE浏览器器选项页都会创建一个Bho类的实例来对应IE选项页
  2. //IE8 是每个Tab 一个独立进程,当IE的Tab进程被创建的时候,都会创建一个Bho类的实例
  3. [ComVisible(true),Guid("BAD13015-0CE2-4220-9ADC-ED513C101155"),ClassInterface(ClassInterfaceType.None)]
  4. public class BHO_ChangeHtml : IObjectWithSite
  5. {
  6. InternetExplorer ie;
  7. Logs logs = new Logs();
  8. public int SetSite(object site)
  9. {
  10. if (site != null)
  11. {
  12. ie = (InternetExplorer)site;
  13. ie.DownloadComplete += new DWebBrowserEvents2_DownloadCompleteEventHandler(ie_DownloadComplete);
  14. }
  15. else
  16. {
  17. ie.DownloadComplete -= new DWebBrowserEvents2_DownloadCompleteEventHandler(ie_DownloadComplete);
  18. }
  19. return ;
  20. }
  21.  
  22. void ie_DownloadComplete()
  23. {
  24. if (ie.LocationURL.ToString().StartsWith("https://www.baidu.com"))
  25. {
  26. if((ie.Document as IHTMLDocument2) != null)
  27. {
  28. var html = (ie.Document as IHTMLDocument2).body.innerHTML.Replace("百度一下", "百度检索");
  29. (ie.Document as IHTMLDocument2).body.innerHTML = html;
  30. }
  31. }
  32. }

IE插件BHO的更多相关文章

  1. 【转】IE劫持原理 BHO

    为什么"浏览器劫持"能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如"我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启 ...

  2. (转)IE劫持原理 BHO

    为什么“浏览器劫持”能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如“我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启它又回来了!”.“我的系统一开 ...

  3. Socket.io在线聊天室

    从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...

  4. IE劫持

    解析雅虎与百度流氓原理- 为什么“浏览器劫持”能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如“我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启它又 ...

  5. C# 开发BHO插件

    BHO(Browser Helper Object)是插件,它寄存在IE浏览器中运行.在咱们的日常生活中无时无刻都在使用BHO,比如:迅雷检测用户是否单击了下载链接的BHO.用BHO也能做出些非常有意 ...

  6. C#开发BHO插件UrlTrack

    最近忽然突发奇想,想统计一下我最经常上的网站是哪些,并且在这些网站上都停留了多久.为此决定写一个BHO插件来做这件事. BHO(Browser Help Objects)是实现了特定接口(IObjec ...

  7. C#为IE编写BHO插件心得

    啥是BHO,其实大家都用过,没听过只是没在意而已,来张图你就知道是什么了 是不是很熟悉,就是这么个玩意~~ 先说说我要用来干嘛~我们有个库,里面数据很全面,但是某个部门需要在第三方的B/S系统录入某些 ...

  8. BHO插件操作IE浏览器,js调用C#方法

    BHO是IE浏览器的扩展程序,全名Browser Helper Object,文件格式为DLL文件.可对IE浏览器的界面和访问内容进行修改操作.BHO只适用于IE浏览器,对其他任何浏览器都没有作用.( ...

  9. 如何使用BHO定制你的Internet Explorer浏览器

    原文出处:Browser Helper Objects: The Browser the Way You Want It一.简介 有时,你可能需要一个定制版本的浏览器.在这种情况下,你可以自由地把一些 ...

随机推荐

  1. Datatable 列查询,统计值

    Column 列查询,如下: var dt = CommonUtil.ToDataTable(dataJson); //判断是否有当前日期数据 var systemDateTime = new Com ...

  2. Centos7上安装dnf-plugins-core

    为了在Centos上使用dnf copr命令,需要安装dnf-plugins-core,找了很长时间,包括试了源码编译安装都不行,最后找到了方法,执行下面的命令就可以了. 需要root权限 wget ...

  3. 《CoffeeScript应用开发》学习: CoffeeScript高级用法

    正确的上下文 使用胖箭头=>表示将回调函数绑定到this对象. class t func: (callback)-> if callback? setTimeout callback(), ...

  4. libsvm 训练后的模型参数讲解(转)

    主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子.测试数据使用的是li ...

  5. python之路-Day5

    1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1. 普通版 a = [0,1,2,3 ...

  6. linux系统数据盘挂载教程

    将数据盘挂载为/www命令:#mkdir /www & mount /dev/sdb1 /www ----------------------------------------------- ...

  7. [知识整理]Java集合(一) - List

    一.实现List的几个类: ArrayList.LinkedList.CopyOnWriteArrayList.Vector 二.几个List底层的数据结构: ArrayList - 数组列表 Lin ...

  8. C# 解析json

    在接口开发的过程中经常通过接口获取数据返回是json格式字符串. 但是返回的字符串可能比较复杂,可能不止一种类型的数据. 例如: { "resultCode": "0&q ...

  9. UIWebView显示乱码问题

    今天有人问Swift中UIWebView加载页面出来的是乱码,问知道怎么解决么? OC我知道肯定不会有乱码问题,Swift就不知道了,因为没有试过.....于是...我自己动手试试啦... OC和Sw ...

  10. LLVM example for main

    #include "llvm/IR/CallSite.h" #include "llvm/IR/Instruction.h" #include "ll ...