65.9K
CodeProject 正在变化。 阅读更多。
Home

Band Objects - .NET 2.0 Redux

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (25投票s)

2006年5月17日

6分钟阅读

viewsIcon

1057059

downloadIcon

3554

Pavel Zolnikov 的 BandObjects 项目的 .NET 2.0 版本。

As Internet Explorer Toolbar

As Taskbar Toolbar

前导码

在开始之前,我强烈建议您先阅读 Pavel Zolnikov 的文章《"Extending Explorer with Band Objects using .NET & Windows Forms"》。

Pavel 写了一篇很棒的文章,解释了如何使用 COM Interop 来编写自定义的 Explorer band objects,使用的是 .NET 2003。没有那篇文章,这篇文章就不会出现,所以要归功于 Pavel。

引言

.NET 2.0 环境的一个优点是包含了一套丰富的表单控件用于表单设计。虽然 2003 环境很棒,但它缺少了许多我们期望在漂亮的 Explorer bar UI 中成为标准的控件,例如工具条和下拉按钮。我的目标是设计一个整洁的工具条解决方案,以便我可以快速链接到我最常使用的网站和系统,并通过定期更新的标签显示数据来提供“一目了然”的信息。

从 2003 到 2005 的飞跃

将 Pavel 的 2003 BandObjectLib 代码移植到 2005 的过程相当顺利,我将简要介绍一些细节。

  1. 第一步是创建一个标准的 Windows 类库。
  2. ComInterop.csBandObject.csAttributes.cs 文件直接从 2003 项目复制到 2005 项目。
  3. 所有 [assembly: ] 属性代码都被移除并放入 AssemblyInfo.cs 文件中。
  4. 添加了对 SHDocVw (COM 选项卡)、System.DrawingSystem.Windows.Forms (.NET 选项卡) 的引用。
  5. 最后,向库添加了一个强命名密钥,以便将其添加到 GAC。在新 IDE 中,这更容易实现,您可以直接右键单击项目文件,选择“属性”,选择“签名”选项卡,然后选择使用新的强命名密钥对程序集进行签名,从而为项目创建 .snk 文件。
  6. 最后一步是在项目属性 >“生成事件”中添加一个生成后事件,将成功编译的程序集添加到全局程序集缓存中。在 VS2005 中,gacutil.exe 工具不再位于框架文件夹中,而是位于 C:\Program Files\ 下的 VS2005/SDK 文件夹中。因此,您可能需要根据您的安装和路径设置来修改此脚本。
cd $(ProjectDir)bin\Debug

"C:\Program Files\Microsoft Visual Studio 8\
      SDK\v2.0\Bin\gacutil" /if CustomToolbar.dll
"C:\Program Files\Microsoft Visual Studio 8\
      SDK\v2.0\Bin\gacutil" /if Interop.SHDocVw.dll

注意 * 如果您打算自己使用此软件,请注意,GAC 中的强命名程序集如果版本号不同,将被视为独立和分开的,因此我建议将库中的程序集版本号保持为某个静态值。例如:

[assembly: AssemblyVersion("1.0.0.0")]

构建我们的第一个工具条

所以我们准备构建第一个工具条。设置项目很容易。在附加的代码中,我只是将其创建为同一解决方案中的一个附加项目。它是一个类库项目。它需要直接引用已安装在 GAC 中的 BandObjectLib 项目的 bin 文件夹中的强命名 DLL。它还需要一个强命名密钥和一个静态程序集版本号。

步骤 1. 添加 BandObject 控件

由于 BandObject 类本质上是 UserControl 的一个增强的派生类,我们可以简单地向我们的项目添加一个 UserControl,然后修改代码隐藏,使我们的控件继承自 BandObject。在此示例中,我正在创建一个水平的 Explorer Toolbar。由于此控件将通过 COM 公开,我们需要指定一个 GUID 属性来唯一标识类。GUID 属性是 System.Runtime.InteropServices 命名空间的一部分。

using BandObjectsLib;
using System.Runtime.InteropServices;

[Guid("AE07101B-46D4-4a98-AF68-0333EA26E113")]
    [BandObject("My Toolbar", BandObjectStyle.Horizontal 
    | BandObjectStyle.ExplorerToolbar 
    | BandObjectStyle.TaskbarToolBar, HelpText = "My First Toolbar")]
    public class MyToolBar : BandObject
    { ...

步骤 2. 构建工具条

通过设计器画布,您可以获得标准 UserControl 的所有功能,可以随意添加任何内容,从简单的按钮到迷你浏览器,再到完全独立的表单,这些表单会在单击事件时弹出。在我的示例中,我添加了一个 ToolStrip 并填充了一些标准的工具条控件:按钮、下拉按钮、标签、文本框、分隔符和进度条。

步骤 3. 嵌入资源

为了让工具条看起来更美观,我将一些 PNG 图片(感谢 www.famfamfam.com 的 silk 图标集合)嵌入到我的项目的嵌入资源文件中,然后设置了按钮图像。只需将您的工具条按钮设置为显示“ImageAndText”或“Image”,并指定一个来自您的 resx 文件的图像。当您编译工具条时,所有图像文件都将嵌入到 DLL 中,因此无需安装目录和文件包。资源文件对于嵌入各种动态资源或使您的工具条支持多语言非常方便。

this.tsbtn1.Image = global::BandObjectsExample.Resources.redcircle;
this.tsbtn1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.tsbtn1.ImageTransparentColor = System.Drawing.Color.Magenta;

步骤 4. 代码隐藏

在我的示例中,我创建了几个示例按钮来打开一些网站,使用您系统的默认浏览器。

private void OpenWebPage(string url)
{
    System.Diagnostics.Process process = new System.Diagnostics.Process();
    process.StartInfo.FileName = url;
    process.Start();
}

作为状态轮询功能的示例,我创建了一个快速粗糙的例程来轮询我的 Winamp 网页界面,获取当前播放的曲目,并在状态条末尾的标签上显示它。这是通过一个每 30 秒滴答一次的计时器执行的。但请注意,您的工具条的多个实例(例如,在多个浏览器中)可能会对您的系统产生不利影响,如果计时器上执行的任务发生得非常频繁或计算量很大。对于我的 Winamp 播放器,我只有一个实例在任务栏上运行,靠近系统时钟。

步骤 5. 构建您的工具条

在 IDE 设计器中完成工具条设计后,就该构建它并进行测试了。您还需要为该项目添加一个生成后任务。第一项任务是将您的工具条 DLL 安装到全局程序集缓存中。由于它将通过 COM 使用,您还需要使用框架安装文件夹中的 Regasm 工具来注册您的程序集。

cd $(ProjectDir)bin\Debug

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /if MyToolbar.dll
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm" MyToolbar.dll

注意 * 默认情况下,.NET 2.0 程序集设置为对 COM 不可见。在您的 AssemblyInfo.cs 文件中,您会找到一个名为 [Assembly:ComVisible] 的属性。此属性指定您的 .NET 程序集中的类型是否应暴露给 COM。您必须将此值设置为 true,否则 Regasm 程序将无法看到您的工具条,注册也会失败。

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components. If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]

步骤 6. 使用工具条

一旦您成功构建并注册了您的工具条,它应该会出现在您的任务栏的右键菜单和 Internet Explorer 的工具条上下文菜单中。值得指出的是,Explorer 在首次加载 COM 对象时会缓存它们,因此在重新生成后,您不一定会看到工具条的更新。有几种方法可以解决这个问题,例如更改您的文件夹设置以在新 Explorer 实例中打开文件夹,或者从任务管理器中终止 Explorer exe(不推荐 :))。

想法,想法,想法

对于这些 band object 控件,天空才是极限。在我的示例中,我只展示了 ToolStrip 控件,填充了一些按钮和其他简单控件。我添加了一些附加功能,如 ContextMenu 和计时器控件,但没有什么能阻止您添加任何可用的控件。如果您想出了一个好的主意,请将其发布到 CodeProject :)。

  • 您可能想制作一个垂直工具条,带有一个迷你 WebBrowserControl 来查看您最喜欢的 Web 门户。
  • 您可以编写自己的 RSS 跑马灯,放在任务栏的时钟旁边,并在您最喜欢的 RSS feed 之间轮播。
  • 或者,您可能可以编写一个 SMS 发送器,登录到您的移动运营商网站,并通过您的帐户发送短信。
© . All rights reserved.