C#开发BHO插件UrlTrack

最近忽然突发奇想,想统计一下我最经常上的网站是哪些,并且在这些网站上都停留了多久。为此决定写一个BHO插件来做这件事。

BHO(Browser Help
Objects)是实现了特定接口(IObjectWithSite)的COM组件。开发好的BHO插件除了要在注册表中注册为COM
Server外,还必须将它的CLSID在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser
Helper Objects下注册为子键。每当浏览器[1]启动时,首先会在上述注册表位置查看是否有注册的BHO
CLSID,如果有则分别创建一个实例,并对BHO实例进行初始化。BHO实例运行在浏览器的地址空间内,能对可访问的对象(如窗口、模块等等)执行任何操作,且因为它依附于浏览器的主窗口,所以其生命周期与浏览器实例的生命周期一致。下图演示了BHO的创建过程:

下面就来介绍一下如何开发BHO插件。首先创建一个C#项目,类型为Class
Library。然后将Class1.cs改名为IObjectWithSite.cs,还要给IObjectWithSite添加两个功能:GetSite和SetSite。

?





1

2

3

4

5

6

7

Public Interface Iobjectwithsite

{

    [Preservesig]

    Int Setsite([Marshalas(Unmanagedtype.Iunknown)]Object Site);

    [Preservesig]

    Int Getsite(Ref Guid Guid, Out Intptr Ppvsite);

}

添加一个cs文件UrlTrack.cs,并且实现IObjectWithSite接口。使用BHO还需要添加两个引用SHDocVw.dll和MSHTML.dll,可以在WindowsSystem32目录下找到。

在IObjectWithSite.cs中,还需要为我们的程序指出IE的GUID,使得它可以挂接(attach)到IE上

?





1

2

3

4

5

[

ComVisible(true),

InterfaceType(ComInterfaceType.InterfaceIsIUnknown),

Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")

]

另外,还需要给BHO程序分配一个GUID,这个可以通过System.Guid.NewGuid()方法得到

?





1

2

3

4

5

[

ComVisible(true),

Guid("e90da13b-117a-4178-8111-0f712da09ff9"),

ClassInterface(ClassInterfaceType.None)

]

在UrlTrack.cs中,我们还需要写两个方法用来DLL注册和移除注册

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

public
static string BHOKEYNAME = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects";

[ComRegisterFunction]

public
static void RegisterBHO(Type type)

{

    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHO_KEY_NAME, true);

    if
(registryKey == null)

    {

        registryKey = Registry.LocalMachine.CreateSubKey(BHO_KEY_NAME);

    }

    string
guid = type.GUID.ToString("B");

    RegistryKey bhoKey = registryKey.OpenSubKey(guid, true);

    if
(bhoKey == null)

    {

        bhoKey = registryKey.CreateSubKey(guid);

    }

    // NoExplorer: dword = 1 prevents the BHO to be loaded by Explorer.exe

    bhoKey.SetValue("NoExplorer", 1);

    bhoKey.Close();

    registryKey.Close();

}

[ComUnregisterFunction]

public
static void UnregisterBHO(Type type)

{

    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHO_KEY_NAME, true);

    string
guid = type.GUID.ToString("B");

    if
(registryKey != null)

        registryKey.DeleteSubKey(guid, false);

}

接下来就是实现具体的统计功能了。考虑一下,当输入网址后,我们需要记录下网址以及当前的时间;当在同一浏览窗口中切换网址时,不仅需要记录下网址和当前时间,还要设置前一个浏览记录的结束时间;并且在关闭浏览器时,也要记下结束时间。所以在SetSite中需要挂载NavigateComplete2和OnQuit事件。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

private
void NavigateComplete2(object
pDisp, ref
object URL)

{

    string
url = URL as
string;

    if
(url.IndexOf("about:blank") >= 0)

    {

        return;

    }

    if
(visitHists.Count > 0)

    {

        VisitHist currentHist = visitHists[visitHists.Count - 1];

        if
(currentHist.VisitUrl != url)

        {

            currentHist.EndTime = System.DateTime.Now;

        }

        else

        {

            return;

        }

    }

    VisitHist newHist = new
VisitHist();

    newHist.StartTime = System.DateTime.Now;

    newHist.VisitUrl = url;

    visitHists.Add(newHist);

}

private
void OnQuit()

{

    if
(visitHists.Count > 0)

    {

        VisitHist currentHist = visitHists[visitHists.Count - 1];

        currentHist.EndTime = System.DateTime.Now;

    }

    // 输出统计记录

    ...

}

开始编译,然后就可以在bin目录下找到项目的dll文件了。在Console中使用regasm /codebase
“UrlTrack.dll”注册dll。打开注册表,在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser
Helper Objects可以看到多出了一个子项{E90DA13B-117A-4178-8111-0F712DA09FF9}。

需要注意的是,需要将AssemblyInfo.cs文件中的ComVisible属性设为true,否则在注册BHO时会得到这样的信息:

?





1

RegAsm : warning RA0000 : No types were registered.

更多的BHO资料可以看这里:Browser
Extensions

[1]
在Windows操作系统上有两种浏览器:资源浏览器(explorer.exe,应用于文件系统)和Internet浏览器(IEXPLORE.EXE,应用于互联网资源)。

代码下载

C#开发BHO插件UrlTrack,布布扣,bubuko.com

时间: 2024-10-12 12:37:07

C#开发BHO插件UrlTrack的相关文章

C# 开发BHO插件

BHO(Browser Helper Object)是插件,它寄存在IE浏览器中运行.在咱们的日常生活中无时无刻都在使用BHO,比如:迅雷检测用户是否单击了下载链接的BHO.用BHO也能做出些非常有意思的程序:窃取用户在网页上输入的密码信息等. 接下来,咱们也来制作一个恶搞的BHO吧,该BHO的功能如下: 1.注册成功后,每当用户浏览一个新的网页时,会自动在该网页中注入一个按钮 2.点击该按钮能获取用户在该网页中输入的敏感信息 操作步骤 图1 图2 图3 图4 图5 图6 图7 程序代码 IOb

Notepad++前端开发常用插件介绍

Notepad++前端开发常用插件介绍 Notepad++除了自身的功能强大之外,更是有许多非常的优秀的插件,下面就总结一下前端开发过程一些比较常用的插件. Emmet Emmet的前身是Zen Coding,一款使用仿CSS选择器的语法来快速开发HTML和CSS的插件,是前端开发神器.它无视了编辑器的自动提示和自动完成,秒杀了你自定义的各种快捷键或者 AHK 的热字符串,以智能简洁高效的缩短输入,带给你超快速地书写各种复杂而枯燥的 HTML 和 CSS 代码的体验.现在可以在Notepad++

Qt5的插件机制(6)--开发Qt插件时几个重要的宏

怎样开发Qt插件,能够在Qt Assistant 中搜索"Qt Plugins"或"How to Create Qt Plugins",看看那篇manual中的介绍. 当中涉及到了几个宏 Q_DECLARE_INTERFACE( ClassName, Identifier) This macro associates the given Identifier (a string literal) to the interface class called Class

如何开发jQuery插件

一:普及JQuery知识 知识1:用JQuery写插件时,最核心的方法有如下两个: $.extend(object) 可以理解为,为JQuery 类添加一个静态方法. $.fn.extend(object) 可以理解为,为JQuery实例添加一个成员函数. 基本的定义与调用: //$.extend的定义 $.extend({ pluginName:function(){ //... } }); //$.extend的调用 $.pluginName(); //$.fn.extend的定义 $.fn

iOS开发- Xcode插件(一)-规范注释生成器VVDocumenter

分享几个常用的Xcode插件. 第一个, 规范注释生成器VVDocumenter. 顾名思义, 它可以很方便的为你自动添加注释 使用效果如下: 下载链接:https://github.com/onevcat/VVDocumenter-Xcode 使用说明: 1.前往GitHub下载工程文件:VVDocumenter-Xcode 2.用Xcode打开工程,Command + B Build成功后,可以在~/Library/Application Support/Developer/Shared/X

Nodejs开发Office插件

如果使用Nodejs开发Office插件,需要借助Yeoman包去生成Office插件 yeoman地址是:http://yeoman.io/generators/,输入office 源码地址是:https://github.com/officedev/generator-office 第一部分就是全局安装yeoman包,及office generator npm install -g yo generator-office 第二部分是利用yeoman命令使用generator-office生成

如何使用Android Studio开发Gradle插件

缘由 首先说明一下为什么会有这篇文章.前段时间,插件化以及热修复的技术很热,Nuwa热修复的工具NuwaGradle,携程动态加载技术DynamicAPK,还有希望做最轻巧的插件化框架的Small.这三个App有一个共同的地方就是大量的使用了Gradle这个强大的构建工具,除了携程的框架外,另外两个都发布了独立的Gradle插件提供自动化构建插件,或者生成热修复的补丁.所以学习一下Gradle插件的编写还是一件十分有意义的事. 插件类型 Gradle的插件一般有这么几种: 一种是直接在项目中的g

C# 开发BHO IE浏览器辅助对象注册安装小结

C# 创建BHO浏览器插件,仅适用于IE浏览器(对于性能和效率更优的方式用C++) BHO插件是在IE启动进程的时候附加到IE中的Dll,在部署安装的时候用.NET FrameWork进行注册: 注册方式简单直接的为强签名: 使用regasm进行注册: regasm /codebase BHO路径(部署的dll的绝对路,如:'C:\\System32\\BHO.dll') 在.NET Framework4.0环境下用批处理注册示例: %SystemRoot%\Microsoft.NET\Fram

CDN公共库、前端开发常用插件一览表(VendorPluginLib)

=======================================================================================前端CDN公共库====================================================================================== 为什么使用前端CDN公共库: 使用前端CDN增加网页的并行载入速度,减少本地服务器的负担,节省流量.我们把静态资源放到自己的服务器上面固