在 Windows 7 任务栏中为多个视图显示 .NET 进度和叠加图标






4.50/5 (12投票s)
本文介绍了如何从非托管 .NET 代码中使用 Windows 7 的新任务栏功能:进度指示和叠加图标。第二部分将介绍如何在存在多个视图(窗口)的情况下管理进度指示和叠加图标,并提供相应的 Windows API 缺失类。
介绍
本文介绍了如何从非托管 .NET 代码中使用 Windows 7 的新任务栏功能:进度指示和叠加图标。第二部分将介绍如何在存在多个视图(窗口)的情况下管理进度指示和叠加图标,并提供相应的 Windows API Code Pack 缺失类。
Windows 7、新任务栏、进度条和叠加图标
如果您查看 Windows 7 官方网站上的 “新功能” 特性列表,排在最前面的是改进的任务栏。
是的,任务栏进行了改头换面,但也有许多真正新的关键功能。在本文中,我想介绍两项内容:进度指示和图标叠加。几乎每个在后台执行某些活动的现代应用程序都需要通知用户,而不会打断用户,告知任务已完成/失败或需要某种关注。

此屏幕截图显示了一些具有不同进度状态和叠加图标的任务栏按钮
- 0 - 正常进度 70%
- 1 - 不确定进度(滚动条)带有红色交叉叠加图标
- 2 - 错误进度 80%
- 3 - 无进度带有星形叠加图标
我们真的需要它吗?
进度指示和叠加图标功能不仅对于以 Windows 7 为目标平台的应用程序来说是“锦上添花”,而且对于许多需要在任务栏中提供进度信息的应用程序来说也是必不可少的。大多数应用程序目前都使用窗口标题,该标题始终会出现在任务栏上(至少是其开头部分)。因此,在这种情况下,您通常会在应用程序图标后面的任务栏按钮上看到文本“完成 27%”或“新消息”。
在 Windows 7 中,默认情况下,您只能看到一个带有高分辨率图标的大按钮,而没有标题(窗口标题)。这意味着,如果我们不使用任务栏进度指示和叠加图标功能,通过窗口标题传达的信息现在将丢失。
如何使用?
Windows 7 API 在 ITaskBarList3
接口上提供了适当的方法 SetOverlayIcon
、SetProgressState
和 SetProgressValue
。为了启用此功能和其他许多功能的使用,Microsoft 提供了一个 .NET 库——Microsoft® .NET Framework 的 Windows® API Code Pack。有关更多信息和 下载,请参阅 Microsoft® .NET Framework 的 Windows® API Code Pack,网址为 code.msdn.microsoft.com/WindowsAPICodePack。
使用这些 .NET 类处理任务栏非常简单,这些类随 C# 代码一起提供。有关详细的分步说明,请参阅 Gunther Lenz 的网络广播 此处。
基本上,您只需要将 Core
和 Shell
项目添加到您的解决方案中,并使用 Microsoft.WindowsAPICodePack.Shell.Taskbar
、Microsoft.WindowsAPICodePack.Shell.Taskbar.ProgressBar
、Microsoft.WindowsAPICodePack.Shell.Taskbar.OverlayIcon
等类,这些类在提供的在线文档中有描述。
我的第一个示例项目 Gma.Windows7.TaskbarDemo1
演示了 Code Pack 提供的基本进度指示和叠加图标功能。
如何处理多个视图?
如果我们一个应用程序有多个窗口(窗体)怎么办?
它们能否各自拥有自己的进度和叠加图标?
这些多个视图在 Windows 7 任务栏中是如何显示的?
每个窗口都有单独进度的场景非常普遍;您可能同时运行多个下载。不幸的是(截至今天),Windows API Code Pack 设计用于管理单个进度条和单个叠加图标。虽然有一个类 MultipleViewProgressBar
和 Taskbar
上有一个相应的成员,但它并不提供正确的行为。我认为在实现过程中整个概念都被误解了,因为您可以在在线帮助中读到:“MultipleViewProgressBar - 代表任务栏按钮的进度条功能,该功能与多个窗口关联。只能显示一个进度条,但可以维护不同窗口的状态。” **这是不正确的。** 一眼望去,您确实只需要一个进度条和一个叠加图标,因为在 Windows 7 中,同一应用程序的所有窗口只有一个按钮。它们堆叠显示,就像叠在一起一样。
但是,在 Windows 7 任务栏属性中有一个选项可以更改。您可以在“始终合并,隐藏标签”、“任务栏已满时合并”和“从不合并”之间进行选择。让我们选择“从不合并”选项。

现在我们每个窗口都有一个按钮,并且我们希望单独管理每个按钮的进度和叠加图标。如果您查看原生 API,您会发现 SetProgressState
和 SetProgressValue
方法将窗口句柄作为第一个参数。似乎 Windows API Code Pack 的托管包装器减少了功能。
是的,我们可以!
我的第二个示例项目 Gma.Windows7.TaskbarDemo2
使用了 Windows API Code Pack 的扩展,这些扩展启用了这些丢失的功能。我希望 Code Pack 的未来版本能在此方面有所改进。原始 Code Pack 和我们“修补”过的 Code Pack 之间的唯一区别是两个额外的类:Microsoft.WindowsAPICodePack.Shell.Taskbar.ProgressBarExt
和 Microsoft.WindowsAPICodePack.Shell.Taskbar.OverlayIconExt
。它们在构造函数中接受一个额外的参数,并绑定到特定的窗口。因此,您可以单独操作每个窗口的进度状态和叠加图标。
这些附加类可以在下载的 ZIP 文件中的以下路径下找到:
- \WindowsAPICodePack\Shell\Taskbar\ProgressBarExt.cs
- \WindowsAPICodePack\Shell\Taskbar\OverlayIconExt.cs
代码示例
使用 Code Pack 为单个任务栏按钮设置进度指示器和叠加图标
using Microsoft.WindowsAPICodePack.Shell.Taskbar;
...
//Set progress to 50%
Taskbar.ProgressBar.CurrentValue = 50;
//Let's show the progress strip in red
Taskbar.ProgressBar.State = TaskbarButtonProgressState.Error;
//Set an overlay icon
Taskbar.OverlayImage=new OverlayImage(new Icon("Star.ico"), "Star");
使用 Code Pack 扩展为多个任务栏按钮设置进度指示器和叠加图标:注意:不要忘记将附加类 Microsoft.WindowsAPICodePack.Shell.Taskbar.ProgressBarExt
和 Microsoft.WindowsAPICodePack.Shell.Taskbar.OverlayIconExt
包含到 Shell
项目中。
using Microsoft.WindowsAPICodePack.Shell.Taskbar;
...
//Create an instance of a corresponding progress bar and overlay image
// [this] is an instance of a form which intends to manage its
// own state in the taskbar
// This construction can be done only once during form construction
ProgressBarExt ownProgressBar = new ProgressBarExt(this);
OverlayImageExt overlayImage = new OverlayImageExt(this);
...
//Set progress to 50%
ownProgressBar.CurrentValue = 50;
//Let's show the progress strip in red
ownProgressBar.State = TaskbarButtonProgressState.Error;
//Set an overlay icon
overlayImage.Icon = new Icon("Star.ico");
overlayImage.Text = "Star";
历史
- 2009 年 6 月 19 日:首次发布