浏览器扩展或插件是增强浏览器功能的程序,它们可以用于检索信息、修改网页内容,或者提供额外的功能,如股票市场状态或天气信息。本文将介绍如何开发一个简单的IE浏览器扩展(BHO)。
对于初学者来说,开始学习BHO开发可能会感到有些沮丧,因为需要学习很多新知识。作为一个初学者,将分享经验,帮助其他初学者入门。
BHO(Browser Helper Object)是一个COM对象,它为每个IE窗口加载。当浏览器窗口打开时,它会创建BHO的一个副本;当窗口关闭时,它会销毁BHO的副本。
要开发BHO,需要一个与浏览器交互的COM DLL。这需要在.NET项目中实现COM互操作库。
让创建一个名为'HelloBHOWorld'的BHO项目。首先,创建一个新的C#类库项目,并重命名Class1.cs为IObjectWithSite.cs。
接下来,需要实现IObjectWithSite接口,并添加GetSite和SetSite方法。这些方法用于获取和设置对象的站点。
在IObjectWithSite.cs文件中,需要指定IE的GUID,以便程序可以附加到IE。代码示例如下:
using System.Runtime.InteropServices;
namespace HelloBHOWorld
{
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
public interface IObjectWithSite
{
[PreserveSig] int SetSite([MarshalAs(UnmanagedType.IUnknown)] object site);
[PreserveSig] int GetSite(ref Guid guid, out IntPtr ppvSite);
}
}
完成IObjectWithSite.cs后,需要添加另一个类文件BHO.cs。在这个文件中,需要添加对SHDocVw.dll和MSHTML.dll的引用。
SHDocVw是Microsoft Shell Doc Object和Control Library,而MSHTML是访问动态HTML(DHTML)对象模型的接口。
在BHO.cs文件中,需要实现IObjectWithSite接口,并定义两个方法。还需要为程序分配一个GUID,并添加WebBrowser和HTMLDocument变量。
在BHO.cs文件中,需要编写两个函数来注册和注销DLL。
public static string BHO_KEY_NAME = "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 ourKey = registryKey.OpenSubKey(guid);
if (ourKey == null)
ourKey = registryKey.CreateSubKey(guid);
ourKey.SetValue("Alright", 1);
registryKey.Close();
ourKey.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);
}
接下来,需要实现OnBeforeNavigate方法,该方法在浏览器导航之前调用。将使用这个方法来获取浏览器中的信息。
public void OnBeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
{
document = (HTMLDocument)webBrowser.Document;
System.Windows.Forms.MessageBox.Show("URL to redirect: " + URL.ToString());
foreach (IHTMLInputElement tempElement in document.getElementsByTagName("INPUT"))
{
System.Windows.Forms.MessageBox.Show(tempElement.name + " = " + tempElement.value);
}
}
注册和注销BHO:
要注册/注销BHO,使用RegAsm.exe,并编写bat文件registercom.bat和unregisterall.bat:
REM register for com so we can test the register/unregister functions while debugging
regasm.exe /codebase "HelloBHOWorld.dll"
pause
REM unregister HelloBHOWorld.dll for COM
regasm.exe /unregister "HelloBHOWorld.dll"
pause
运行registercom.bat文件,然后打开IE浏览器,转到“工具”>“管理加载项…”,应该能看到BHO在列表中。
现在浏览任何网站(如google.com),在输入框中输入文本并点击按钮。应该能看到弹出的信息。