【问题标题】:Windows 7 progress bar in taskbar in C#?C#任务栏中的Windows 7进度条?
【发布时间】:2010-11-20 17:17:27
【问题描述】:

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

【问题讨论】:

    标签: c# windows-7 progress-bar


    【解决方案1】:

    我只是想在我的 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);
    

    【讨论】:

    • 这是一个非常棒的答案;没有外部依赖项或下载,并且可以正常工作
    • 如果您想像我一样添加 SetOverlayIcon,请务必以正确的顺序添加所有其他方法。请参阅stackoverflow.com/questions/1024786/… 接受的答案
    • 不幸的是,这会破坏在 Windows XP 上运行的应用程序!有什么解决办法吗?
    • 解决方案是确保您不要在 XP 中执行此操作。
    • @KevinVuilleumier 真正的解决方案是在运行代码之前检查Windows版本
    【解决方案2】:

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

    • 下载Windows API Code Pack for Microsoft .Net Framework
    • 运行创建 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);
    

    【讨论】:

    • nuget 下载有点烦人,但是是的,效果很好。在我的进度条处理程序类中实现:)
    • @Nyerguds:nuget 下载有什么烦人的?只需将命令复制并粘贴到 nuget 的控制台上即可。
    • 这意味着必须下载并安装另一个东西......即nuget。
    • 我在使用链接的 Microsoft 的 WindowsAPICodePack 时遇到了麻烦(由于需要强命名库,我的应用程序在启动时崩溃了)。一个非官方的 nuget 包 nuget.org/packages/Microsoft.WindowsAPICodePack.Shell 对我来说效果更好。
    【解决方案3】:

    【讨论】:

    • 甚至包括一个关于这个主题的精彩视频。
    • 需要 .NET 3.5 或 4。似乎不适用于 .NET 2。
    • 3.5 随 Windows 7 一起分发,根据en.wikipedia.org/wiki/.NET_Framework
    • 在 XP 上运行时包含这个会破坏应用程序吗? (已安装.net 3.5 / 4.0)
    【解决方案4】:

    是的,Microsoft 在以下文档中介绍了新的任务栏功能(包括来源):Windows 7 taskbar: Developer Resources

    【讨论】:

      【解决方案5】:

      是的,您需要使用此 API。

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 请注意,link-only answers are discouraged,SO 答案应该是搜索解决方案的终点(与另一个中途停留的参考相比,它往往会随着时间的推移变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
        猜你喜欢
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        • 2013-07-10
        • 1970-01-01
        相关资源
        最近更新 更多