75

如果您在 Windows 7 测试版中注意到,如果您复制文件或其他系统操作,任务栏中的 Windows 资源管理器图标将填满一个绿色进度条,相当于表单上的进度条。有没有一种方法可以在我的 C# 表单中强制我的任务栏进度条与我正在执行的任何任务的进度相匹配?转换、传输、生成,那个进度条有很多用途。

4

6 回答 6

86

我只是想在我的 WinForms 应用程序中添加一些任务栏进度动画,而无需下载代码包或切换到 WPF 以使用 TaskbarItemInfo。

解决方案是一个使用 ITaskbarList3 接口的类:

using System;
using System.Runtime.InteropServices;

public static class TaskbarProgress
{
    public enum TaskbarStates
    {
        NoProgress    = 0,
        Indeterminate = 0x1,
        Normal        = 0x2,
        Error         = 0x4,
        Paused        = 0x8
    }

    [ComImport()]
    [Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    private interface ITaskbarList3
    {
        // ITaskbarList
        [PreserveSig]
        void HrInit();
        [PreserveSig]
        void AddTab(IntPtr hwnd);
        [PreserveSig]
        void DeleteTab(IntPtr hwnd);
        [PreserveSig]
        void ActivateTab(IntPtr hwnd);
        [PreserveSig]
        void SetActiveAlt(IntPtr hwnd);

        // ITaskbarList2
        [PreserveSig]
        void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen);

        // ITaskbarList3
        [PreserveSig]
        void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal);
        [PreserveSig]
        void SetProgressState(IntPtr hwnd, TaskbarStates state);
    }

    [ComImport()]    
    [Guid("56fdf344-fd6d-11d0-958a-006097c9a090")]
    [ClassInterface(ClassInterfaceType.None)]
    private class TaskbarInstance
    {
    }

    private static ITaskbarList3 taskbarInstance = (ITaskbarList3)new TaskbarInstance();
    private static bool taskbarSupported = Environment.OSVersion.Version >= new Version(6, 1);

    public static void SetState(IntPtr windowHandle, TaskbarStates taskbarState)
    {
        if (taskbarSupported) taskbarInstance.SetProgressState(windowHandle, taskbarState);
    }

    public static void SetValue(IntPtr windowHandle, double progressValue, double progressMax)
    {
        if (taskbarSupported) taskbarInstance.SetProgressValue(windowHandle, (ulong)progressValue, (ulong)progressMax);
    }
}

它是多么容易使用的例子:

TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Indeterminate);

or

TaskbarProgress.SetValue(this.Handle, 50, 100);
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Error);
于 2014-06-12T14:37:15.490 回答
52

对于那些想要跳过阅读文档并获得一些有用的东西的人......

  • 下载 适用于 Microsoft .Net Framework 的 Windows API 代码包
  • 运行创建 zip 文件的安装程序
  • 从 zip 文件的二进制文件夹中提取以下 dll:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • 在您的项目中添加对它们的引用
  • 将以下代码放入您的应用程序并根据需要进行修改:

--

  int max = 100;
  var prog = Microsoft.WindowsAPICodePack.Taskbar.TaskbarManager.Instance;
  prog.SetProgressState(Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.Normal);
  for(int i=0;i<max;i++) {
     prog.SetProgressValue(i, max);
     Thread.Sleep(100);     
  }
  prog.SetProgressState(Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.NoProgress);
于 2013-06-21T20:41:32.843 回答
39

查看Microsoft .Net Framework 的 Windows API 代码包

于 2009-08-18T19:16:20.417 回答
5

是的,Microsoft 在以下文档中介绍了新的任务栏功能(包括来源):Windows 7 任务栏:开发人员资源

于 2009-08-18T19:20:31.547 回答
4

是的,您需要使用此 API。

http://code.msdn.microsoft.com/WindowsAPICodePack

于 2009-08-18T19:16:40.587 回答
0

我发现了一篇漂亮的文章(链接),它为任务栏进度条问题提供了一个简单的解决方案。总之,它指导您从 MSDN 网站下载 Windows API 包,添加对其包含的 Microsoft.WindowsAPICodePack.Shell.dll 的引用,最后在您的应用程序中添加三行代码:

Imports Microsoft.WindowsAPICodePack
Imports Microsoft.WindowsAPICodePack.Taskbar
// ...
TaskbarManager.Instance.SetProgressValue(X, 100)

其中 X 是您要显示的进度。

于 2014-02-12T00:36:17.397 回答