使用 Band 对象扩展浏览器框架
1. BandObject 类与 IDockingWindow 接口
BandObject 类的用户界面(.NET UserControl 的实现)会被放置并停靠到 IE 站点。为了响应窗口位置和停靠的变化,该类实现了 IDockingWindow 接口。此接口定义了一些函数,当重要的停靠窗口事件发生时,这些函数会被调用。以下是 IDockingWindow 接口的实现代码:
#region IDockingWindow Interface Implementation
public void CloseDW(uint dwReserved)
{
// Dispose of the current object
Dispose(true);
}
public void ResizeBorderDW(IntPtr prcBorder, object punkToolbarSite, bool fReserved)
{
// Perform no action and return
return;
}
public void ShowDW(bool bShow)
{
// If bShow is true, show the user control; otherwise hide it
if (bShow) Show();
else Hide();
}
#endregion IDockingWindow Interface Implementation
- CloseDW 函数 :用于通知停靠窗口即将关闭。在很多应用中,这个调用可以作为在退出前持久化信息的机会。这里用于以正确的方式处理托管对象。
- ResizeBorderDW 函数 :通知停靠窗口发生了大小调整事件,但在这个实现中,BandObject 类不执行任何特殊操作。
- ShowDW 函数 :用于通知停靠窗口的可见状态,根据传入的布尔值决定是否显示。
2. 注册 Band 对象
实现了 Band 对象后,必须将其同时注册到 COM 和 IE 中,才能在浏览器中加载。以下是 COM 注册方法:
#region COM Registration Methods
[ComRegisterFunction]
public static void Register(Type t) { ... }
[ComUnregisterFunction]
public static void Unregister() { ... }
#endregion COM Registration Methods
注册过程会获取从 BandObject 基类派生的扩展定义的元数据,并将其注册到 COM 和 IE 中。这些数据通过调用超类实现的 DefineMetadata() 方法获取。以下是注册函数的定义:
[ComRegisterFunction]
public static void Register(Type t)
{
// Call the define metadata function for the class instance
// implementing this base class
((BandObject)Activator.CreateInstance(t)).DefineMetadata();
try
{
// Open the HKEY_CLASSES_ROOT\CLSID key and create the subkey
// for the extension's GUID
RegistryKey classIdKey = Registry.ClassesRoot.CreateSubKey(@"CLSID\" + ClassId);
{
// Set the default value to be the object name
classIdKey.SetValue(String.Empty, ObjectName);
// Set the menu text to be the object name
classIdKey.SetValue("MenuText", ObjectName);
// Set the help text to the help text value
classIdKey.SetValue("HelpText", HelpText);
...
注册完成后,会向 HKEY_CLASSES_ROOT(用于 COM 注册)和 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER 中的 IE 键(用于 IE 注册)写入一些注册表项。以下是一个示例注册表项:
HKEY_CLASSES_ROOT\
CLSID\
{0A7D6D96-7822-4389-B07E-494E5E25A83A}\
(Default) = "TodoBar" (REG_SZ)
HelpText = "Example Toolbar for IE" (REG_SZ)
MenuText = "TodoBar" (REG_SZ)
Implemented Categories\
{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}\
InprocServer32\
(Default) = "mscoree.dll" (REG_SZ)
Assembly = "Toolbar, Version=1.0.0.0..." (REG_SZ)
Class = "ProIeDev.BandObjectDemo.Toolbar.Toolbar" (REG_SZ)
CodeBase = "file:///..." (REG_SZ)
RuntimeVersion = "v2.0.50727" (REG_SZ)
ThreadingModel = "Apartment" (REG_SZ)
1.0.0.0\
Assembly = "Toolbar, Version=1.0.0.0..." (REG_SZ)
Class = "ProIeDev.BandObjectDemo.Toolbar.Toolbar" (REG_SZ)
CodeBase = "file:///..." (REG_SZ)
RuntimeVersion = "v2.0.50727" (REG_SZ)
Instance\
CLSID = "{E31EAE3B-65E1-4D56-A3D0-9E653D978A9A}" (REG_SZ)
InitPropertyBag\
Url = "" (REG_SZ)
ProgId\
(Default) = "ProIeDev.BandObjectDemo.Toolbar" (REG_SZ)
- GUID :扩展的 GUID 作为 HKEY_CLASSES_ROOT\CLSID 下的一个键添加。
- 名称和文本 :名称、帮助菜单文本和扩展菜单项文本作为字符串值添加到该键中。
- Implemented Categories 键 :用于告诉 Windows 这是什么类型的对象。所有 Band 对象都注册为实现一个公共类别,垂直和水平资源管理器栏还会注册一个额外的类别。
- InprocServer32 键 :包含关于扩展的各种数据,如控件、入口点、线程样式、所需库等。
- Instance 键 :定义实例的初始属性。
- ProgId 键 :定义该扩展的 ProgId,供其他 COM 对象访问。
3. 不同类型的注册
- 工具栏注册 :工具栏必须向 IE 注册才能在浏览器中加载并向用户展示。以下是一个工具栏注册的示例:
HKEY_LOCAL_MACHINE\
Software\
Microsoft\
Internet Explorer\
Toolbar\
{0A7D6D96-7822-4389-B07E-494E5E25A83A} = "TodoBar" (REG_SZ)
这些值只能放在 HKEY_LOCAL_MACHINE 中,作为 Software\Microsoft\Internet Explorer\Toolbar 子键下的字符串值。
-
资源管理器栏注册
:资源管理器栏必须通过 IE 资源管理器栏注册表项向 IE 展示。值可以放在 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER 中,单个扩展定义为以其 GUID 为名称的键,放在 Software\Microsoft\Internet Explorer\Explorer Bars 子键下。以下是一个示例:
HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER\
Software\
Microsoft\
Internet Explorer\
Explorer Bars\
{FBAC3BF8-5210-4B61-879D-715396839846}\
BarSize = 00 00 00 00 (REG_BINARY)
BarSize 是一个可选的二进制值,用于指示首次显示资源管理器栏时应使用的默认宽度(垂直资源管理器栏)或高度(水平资源管理器栏),用于持久化用户的自定义设置。
4. 注销函数
注销函数用于删除注册函数创建的注册表项:
[ComUnregisterFunction]
public static void Unregister()
{
try
{
// Access the CLSID key in the registry
RegistryKey clsidKey = Registry.ClassesRoot.OpenSubKey("CLSID", true);
{
// Delete the subkey containing the ClassID if possible
clsidKey.DeleteSubKey(ClassId);
}
}
catch (Exception) { }
}
该函数不会删除在 IE 注册表节点中创建的值,因为一旦 COM 对象条目被删除,IE 就不再认为该扩展有效。
5. 构建不同类型的扩展
- 构建工具栏 :可以通过一个新的 .NET 项目创建工具栏扩展,该项目包含一个以 BandObject 库为基类的类。首先定义一个实现 BandObject 并实现虚函数 DefineMetadata() 的类:
[ComVisible(true)]
public class Toolbar : BandObject.BandObject
{
public Toolbar() ...
public override void DefineMetadata() ...
#region Form Designer ...
}
以下是 DefineMetadata() 函数的实现:
public override void DefineMetadata()
{
ClassId = "{0A7D6D96-7822-4389-B07E-494E5E25A83A}";
ProgId = "ProIeDev.BandObjectDemo.Toolbar";
ObjectName = "TodoBar";
ObjectTitle = "TodoBar";
HelpText = "Example Toolbar for IE.";
InitialSize = new System.Drawing.Size(500, 30);
IntegralSize = new System.Drawing.Size(0, 0);
MinSize = new System.Drawing.Size(500, 30);
MaxSize = new System.Drawing.Size(500, 500);
Style = BandObjectTypes.Toolbar;
}
最后,将 UI 元素添加到用户控件中:
#region Form Designer
private System.Windows.Forms.Label TodoLabel;
private System.Windows.Forms.Button GoButton;
private System.Windows.Forms.TextBox TodoTextBox;
private void InitializeComponent()
{
this.TodoLabel = new System.Windows.Forms.Label();
this.TodoTextBox = new System.Windows.Forms.TextBox();
this.GoButton = new System.Windows.Forms.Button();
this.SuspendLayout();
...
注册该控件后,会将扩展添加到 Windows 注册表中作为新的 COM 对象,并向 IE 注册。
- 构建垂直资源管理器栏 :同样可以通过新的 .NET 项目创建垂直资源管理器栏扩展。定义一个实现 BandObject 并实现 DefineMetadata() 函数的类:
[ComVisible(true)]
public class VerticalExplorerBar : BandObject.BandObject
{
public VerticalExplorerBar () ...
public override void DefineMetadata() ...
#region Form Designer ...
}
DefineMetadata() 函数的实现如下:
public override void DefineMetadata()
{
ClassId = "{FBAC3BF8-5210-4B61-879D-715396839846}";
ProgId = "ProIeDev.BandObjectDemo.VerticalExplorerBar";
ObjectName = "TodoBar Vertical";
ObjectTitle = "TodoBar Vertical";
HelpText = "TodoBar Vertical";
Style = BandObjectTypes.VerticalExplorerBar;
}
添加 UI 元素:
#region Form Designer
private System.Windows.Forms.TextBox TodoTextbox;
private System.Windows.Forms.Label TodoLabel;
private System.Windows.Forms.Button GoButton;
private void InitializeComponent()
{
this.TodoTextbox = new System.Windows.Forms.TextBox();
this.TodoLabel = new System.Windows.Forms.Label();
this.GoButton = new System.Windows.Forms.Button();
this.SuspendLayout();
...
注册后,垂直资源管理器栏会被添加到 IE 中。
- 构建水平资源管理器栏 :创建水平资源管理器栏扩展的步骤与上述类似。定义类:
[ComVisible(true)]
public class HorizontalExplorerBar : BandObject.BandObject
{
public HorizontalExplorerBar () ...
public override void DefineMetadata() ...
#region Form Designer ...
}
DefineMetadata() 函数:
public override void DefineMetadata()
{
ClassId = "{B028EA5C-B226-4E4B-88C6-8842A152BC5B}";
ProgId = "ProIeDev.BandObjectDemo.HorizontalExplorerBar";
ObjectName = "TodoBar Horizontal";
ObjectTitle = "TodoBar Horizontal";
HelpText = "TodoBar Horizontal";
Style = BandObjectTypes.HorizontalExplorerBar;
}
添加 UI 元素:
#region Form Designer
private System.Windows.Forms.Label TodoLabel;
private System.Windows.Forms.TextBox TodoTextbox;
private System.Windows.Forms.Button GoButton;
private void InitializeComponent()
{
this.GoButton = new System.Windows.Forms.Button();
this.TodoLabel = new System.Windows.Forms.Label();
this.TodoTextbox = new System.Windows.Forms.TextBox();
this.SuspendLayout();
...
注册后,水平资源管理器栏会在 IE 中显示。
下面是一个简单的 mermaid 流程图,展示了创建扩展的基本流程:
graph LR
A[创建 .NET 项目] --> B[定义实现 BandObject 的类]
B --> C[实现 DefineMetadata() 函数]
C --> D[添加 UI 元素]
D --> E[注册到 COM 和 IE]
通过以上步骤,我们可以使用 Band 对象扩展浏览器框架,创建各种类型的扩展。
使用 Band 对象扩展浏览器框架
6. 不同类型扩展的注册对比
为了更清晰地了解不同类型扩展(工具栏、垂直资源管理器栏、水平资源管理器栏)的注册差异,我们可以通过以下表格进行对比:
| 扩展类型 | COM 注册关键信息 | IE 注册位置 | 特殊注册项 |
| ---- | ---- | ---- | ---- |
| 工具栏 | 扩展 GUID 作为 HKEY_CLASSES_ROOT\CLSID 下的键,包含名称、文本、实现类别、InprocServer32 等信息 | HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar | 无 |
| 垂直资源管理器栏 | 同工具栏,额外实现一个类别 {00021493 - 0000 - 0000 - C000 - 000000000046} | HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Explorer Bars | BarSize(可选,用于定义默认宽度) |
| 水平资源管理器栏 | 同工具栏,额外实现一个类别 {00021493 - 0000 - 0000 - C000 - 000000000046} | HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Explorer Bars | BarSize(可选,用于定义默认高度) |
7. 实现细节分析
-
IDockingWindow 接口函数作用
-
CloseDW函数:主要用于在窗口关闭前进行资源释放,如代码中调用Dispose(true)来正确处理托管对象。这对于一些需要在关闭时保存数据或清理资源的应用非常重要。 -
ResizeBorderDW函数:在当前实现中,该函数不执行任何操作。但在实际应用中,如果需要对窗口大小调整事件做出响应,如重新布局 UI 元素,就可以在这个函数中添加相应的代码。 -
ShowDW函数:根据传入的布尔值决定是否显示用户控件,实现了窗口的显示和隐藏功能。
-
-
注册过程分析
-
COM 注册
:通过
[ComRegisterFunction]标记的Register函数,首先调用DefineMetadata函数获取扩展的元数据,然后将这些数据写入 HKEY_CLASSES_ROOT\CLSID 下的相应键中。这些数据包括扩展的名称、文本、实现类别、InprocServer32 等信息,为 COM 系统识别和加载扩展提供了必要的信息。 - IE 注册 :不同类型的扩展在 IE 中的注册位置不同。工具栏只能在 HKEY_LOCAL_MACHINE 中注册,而资源管理器栏可以在 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER 中注册。注册信息主要是扩展的 GUID 和名称,用于 IE 识别和加载扩展。
-
COM 注册
:通过
8. 注意事项
-
注销操作
:在注销扩展时,虽然
Unregister函数只删除了 HKEY_CLASSES_ROOT\CLSID 下的键,但实际上也会导致 IE 不再识别该扩展。不过,为了避免 IE 在加载时浪费时间查找不存在的扩展,建议在注销时也清理 IE 注册表节点中的相关信息。 - 资源管理器栏的 BarSize :BarSize 是一个可选的二进制值,用于定义资源管理器栏的默认宽度或高度。在实际应用中,可以根据用户的需求设置这个值,以提供更好的用户体验。
9. 总结与展望
通过使用 Band 对象,我们可以方便地扩展浏览器框架,创建各种类型的扩展,如工具栏、垂直资源管理器栏和水平资源管理器栏。整个过程包括定义类、实现元数据函数、添加 UI 元素和进行注册等步骤。
在未来的开发中,我们可以进一步优化扩展的功能,例如添加更多的交互性、支持更多的自定义设置等。同时,也可以考虑将这些扩展应用到其他浏览器中,以扩大其使用范围。
下面是一个 mermaid 流程图,展示了注册和注销扩展的完整流程:
graph LR
A[创建扩展类] --> B[实现 DefineMetadata 函数]
B --> C[添加 UI 元素]
C --> D[COM 注册]
D --> E[IE 注册]
E --> F[扩展可用]
F --> G[使用扩展]
G --> H[注销扩展]
H --> I[删除 COM 注册信息]
I --> J[可选:删除 IE 注册信息]
通过以上的介绍和分析,相信大家对使用 Band 对象扩展浏览器框架有了更深入的了解。希望这些内容能帮助大家在实际开发中顺利创建出各种实用的浏览器扩展。
超级会员免费看
15

被折叠的 条评论
为什么被折叠?



