【问题标题】:How do I code a progress bar for Windows 7 to also update itself on the taskbar?如何为 Windows 7 编写进度条以在任务栏上进行自我更新?
【发布时间】:2010-11-11 21:45:35
【问题描述】:

Windows 7 有一个很棒的新功能,应用程序可以通过状态栏报告当前活动的进度。例如,当使用 Windows 资源管理器复制文件时,任务栏中的应用程序图标上方会出现一个进度条,并在更新时显示进度。

显示进度条的 API 是什么?上面有 MSDN 文档吗?

【问题讨论】:

    标签: c# .net c++ windows-7


    【解决方案1】:

    如果您打算使用其他 Windows 7 任务栏功能,另一种方法是使用 Microsoft 提供的库:Windows API Code Pack for .NET Framework,old link 不再提供,但可以在 @ 987654322@.

    【讨论】:

      【解决方案2】:

      适用于 .NET 4 以下或任何 .NET 版本的 WinForms

      使用 Microsoft 的 Windows API Code Pack(正如 Keeron 所提到的),这真的很简单。您只需要使用TaskbarManager。例如

      开始进度:

      TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal);
      

      更新进度:

      TaskbarManager.Instance.SetProgressValue(currentValue, maxProgressValue);
      

      当你完成时,结束进度:

      TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);
      

      您可以做的还有很多,但这应该可以帮助您入门,并且可能就是您所需要的。

      对于带有 WPF 的 .NET 4 及更高版本

      您可以使用System.Windows.Shell.TaskbarItemInfo。例如。在主窗口的 Xaml 中,您需要添加:

      <Window.TaskbarItemInfo>
          <TaskbarItemInfo x:Name="taskBarItemInfo" />
      </Window.TaskbarItemInfo>
      

      然后要更新进度,您可以执行以下操作:

      taskBarItemInfo.ProgressState = TaskbarItemProgressState.Normal;
      
      for (int i = 0; i < 100; i++)
      {
          taskBarItemInfo.ProgressValue = i / 100.0;
          Thread.Sleep(50); // whatever the 'work' really is
      }
      
      taskBarItemInfo.ProgressState = TaskbarItemProgressState.None;
      

      不要忘记,如果您在后台线程上执行“工作”(这对于长时间运行的任务可能是个好主意),您将需要切换回 UI 线程以更新任务栏。

      【讨论】:

      • Windows API CodePack 链接是一个损坏的链接,尽管nuget.org/packages/Microsoft.WindowsAPICodePack-Core 仍然可以从 nuget 获得它
      • 答案和评论中链接的包实际上并不包含所需的类。该类在 Shell 包中:nuget.org/packages/WindowsAPICodePack-Shell
      • 在系统属性 > 高级 > 性能选项 > 视觉效果中禁用“任务栏和开始菜单中的动画”选项时,我花了一段时间才发现 Indeterminate 不起作用。
      • 记住 .ProgressValue 以从 0 到 1 的分数运行也很重要
      【解决方案3】:

      MSDN 杂志上有一篇关于the new taskbar APIs 的好文章。是的,这个功能很棒:-)

      本质上,这一切都是为了实现IFileOperation。有一篇关于在托管代码中使用它的好文章here

      【讨论】:

      • 你的第二个链接好像坏了
      • 我将链接改为archive.org。
      【解决方案4】:

      我写了一篇关于在 C# 中实现 Windows 7 任务栏进度 API 的文章(请参阅:Windows 7 Taskbar Progress Bar with C# and .NET)。该控件是开源的 (BSD) 并且有 C# 和 VB.NET 的示例项目。

      这样您就不必从头开始转换 C++ 代码。

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 1970-01-01
        • 2011-01-11
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        相关资源
        最近更新 更多