C#实现win7任务栏进度条
用过win7的人都知道,当我们用IE或firefox下载某个东西是任务栏上就会出现进度条,这大大增加了界面的友好程度,如下图所示。那我们怎么用c#来实现呢?
任务栏进度条并不是在.net框架里的,当时我在.net里找了很久,走了不少弯路,惭愧啊!
由于.net是面向所有windows平台的,win7只是一个特例,微软也不会为了一个win7就增加.net的容量。win7的任务栏进度条有一个专门的类TaskbarManager,他在Windows API Code Pack里面,下载地址:
http://archive.msdn.microsoft.com/WindowsAPICodePack
里面包含了所有的源代码以及大量的示例,并附有文档。
为了使用TaskbarManager类,首先要引用Microsoft.WindowsAPICodePack.dll和Microsoft.WindowsAPICodePack.Shell.dll这两个库,他们在binaries文件夹里,然后在程序里申明 Microsoft.WindowsAPICodePack.Taskbar和Microsoft.WindowsAPICodePack.Shell。具体用法看下面的例子,这是Windows API Code Pack 1.1\source\Samples\Shell\TaskbarDemo例子的一部分,还有其他功能就不一一列出来了,感兴趣的自己可以去看看。
// Copyright (c) Microsoft Corporation. All rights reserved.using System;using System.IO;using System.Windows.Forms;using Microsoft.WindowsAPICodePack.Shell;using Microsoft.WindowsAPICodePack.Taskbar;using System.Reflection;namespace TaskbarDemo{public partial class ChildDocument : Form{// Keep a reference to the Taskbar instanceprivate TaskbarManager windowsTaskbar = TaskbarManager.Instance;private JumpList childWindowJumpList;private string childWindowAppId;void ChildDocument_Shown(object sender, EventArgs e){// Set our defaultwindowsTaskbar.SetProgressState(TaskbarProgressBarState.NoProgress, this.Handle);}#region Progress Barprivate void trackBar1_Scroll(object sender, EventArgs e){// When the user changes the trackBar value,// update the progress bar in our UI as well as TaskbarprogressBar1.Value = trackBar1.Value;windowsTaskbar.SetProgressValue(trackBar1.Value, 100, this.Handle);}private void comboBoxProgressBarStates_SelectedIndexChanged(object sender, EventArgs e){// Update the status of the taskbar progress barTaskbarProgressBarState state = (TaskbarProgressBarState)(Enum.Parse(typeof(TaskbarProgressBarState),(string)comboBoxProgressBarStates.SelectedItem));windowsTaskbar.SetProgressState(state, this.Handle);// Update the application progress bar,// as well disable the trackbar in some casesswitch (state){case TaskbarProgressBarState.Normal:if (trackBar1.Value == 0){trackBar1.Value = 20;progressBar1.Value = trackBar1.Value;}progressBar1.Style = ProgressBarStyle.Continuous;windowsTaskbar.SetProgressValue(trackBar1.Value, 100, this.Handle);trackBar1.Enabled = true;break;case TaskbarProgressBarState.Paused:if (trackBar1.Value == 0){trackBar1.Value = 20;progressBar1.Value = trackBar1.Value;}progressBar1.Style = ProgressBarStyle.Continuous;windowsTaskbar.SetProgressValue(trackBar1.Value, 100, this.Handle);trackBar1.Enabled = true;break;case TaskbarProgressBarState.Error:if (trackBar1.Value == 0){trackBar1.Value = 20;progressBar1.Value = trackBar1.Value;}progressBar1.Style = ProgressBarStyle.Continuous;windowsTaskbar.SetProgressValue(trackBar1.Value, 100, this.Handle);trackBar1.Enabled = true;break;case TaskbarProgressBarState.Indeterminate:progressBar1.Style = ProgressBarStyle.Marquee;progressBar1.MarqueeAnimationSpeed = 30;trackBar1.Enabled = false;break;case TaskbarProgressBarState.NoProgress:progressBar1.Value = 0;trackBar1.Value = 0;progressBar1.Style = ProgressBarStyle.Continuous;trackBar1.Enabled = false;break;}}#endregionprivate void button1_Click(object sender, EventArgs e){childWindowJumpList = JumpList.CreateJumpListForIndividualWindow(childWindowAppId, this.Handle);((Button)sender).Enabled = false;groupBoxCustomCategories.Enabled = true;buttonRefreshTaskbarList.Enabled = true;}}}
首先获得程序的一个TaskbarManager对象,上面是调用TaskbarManager.Instance实现的,这是一个静态方法,得到windowsTaskbar对象。TaskbarManager有一个SetProgressValue方法,通过调用它就可以设置任务栏进度条的Value,他有多种重载方式,请参考说明文档。SetProgressState方法用来设置任务栏进度条的状态,共有5种状态NoProgress、Indeterminate、Normal、Error、Paused。
运行效果如下图:
当然还可以设置OverlayIcon、ThumbnailToolbar 、TabbedThumbnail 来美化我们的程序,在pack提供的sample中都有他们的使用例子。
最后一点,这种效果只有在win7或vista里才能使用(win8不知道,应该也行吧),所以在使用时要判断一下系统是不是支持。有三种方法,分别是:
//方法一if (System.Environment.OSVersion.Version.Major >= 6) //make sure you are not on a legacy OS{//.........................}//方法二CoreHelpers.ThrowIfNotWin7();//不符合就return//方法三if(TaskbarManager.IsPlatformSupported){//...................................}
国外参考资料:
http://www.codeproject.com/Articles/49983/Task-Manager
Task Manager
http://www.codeproject.com/Articles/65185/Windows-7-Taskbar-C-Quick-Reference
Windows 7 Taskbar C# Quick Reference
http://msdn.microsoft.com/en-us/gg465001
Exercise: Experiment with the New Windows 7 Taskbar Features