Windows 7的进度条在C#中的任务栏?
如果您在Windows 7testing版中注意到,如果您复制文件或其他系统操作,则任务栏中的Windows资源pipe理器图标将填充与表单上的进度栏相同的绿色进度条。 有没有一种方法,在我的C#forms,我可以强制我的任务栏进度栏,以匹配我正在做的任何任务的进展? 转换,转换,生成,这个进度条有很多用途。
我只是想添加一些任务栏进度animation到我的WinForms应用程序,而不必下载代码包或切换到WPF使用TaskbarItemInfo。
该解决scheme是一个使用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);
对于那些想跳过阅读文档的人来说,只是想得到一些有用的东西。
- 下载用于Microsoft .Net Framework的Windows API代码包 。
- 运行创build一个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);
查看适用于Microsoft .Net Framework的Windows API代码包 。
是的,Microsoft覆盖了以下文档(包括来源)中的新任务栏function: Windows 7任务栏:开发人员资源
是的,你需要使用这个API。
我发现了一个美丽的文章( 链接 ),提供了一个简单的解决scheme,任务栏进度条问题。 总之,它指示您从MSDN网站下载Windows API包,添加对其包含的Microsoft.WindowsAPICodePack.Shell.dll的引用,最后将三行代码添加到您的应用程序中:
Imports Microsoft.WindowsAPICodePack Imports Microsoft.WindowsAPICodePack.Taskbar // ... TaskbarManager.Instance.SetProgressValue(X, 100)
其中X是您要显示的进度。