首页 / C# / C#开发BHO插件UrlTrack
C#开发BHO插件UrlTrack
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#开发BHO插件UrlTrack,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3698字,纯文字阅读大概需要6分钟。
内容图文
最近忽然突发奇想,想统计一下我最经常上的网站是哪些,并且在这些网站上都停留了多久。为此决定写一个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,应用于互联网资源)。
原文:http://www.cnblogs.com/mvc2014/p/3775986.html
内容总结
以上是互联网集市为您收集整理的C#开发BHO插件UrlTrack全部内容,希望文章能够帮你解决C#开发BHO插件UrlTrack所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。