C#实现win7任务栏进度条

C#实现win7任务栏进度条

2012年04月14日  分类:学习笔记C#

用过win7的人都知道,当我们用IE或firefox下载某个东西是任务栏上就会出现进度条,这大大增加了界面的友好程度,如下图所示。那我们怎么用c#来实现呢?

win7 taskbar

任务栏进度条并不是在.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例子的一部分,还有其他功能就不一一列出来了,感兴趣的自己可以去看看。

  
  
  1. // Copyright (c) Microsoft Corporation. All rights reserved.
  2. using System;
  3. using System.IO;
  4. using System.Windows.Forms;
  5. using Microsoft.WindowsAPICodePack.Shell;
  6. using Microsoft.WindowsAPICodePack.Taskbar;
  7. using System.Reflection;
  8. namespace TaskbarDemo
  9. {
  10. public partial class ChildDocument : Form
  11. {
  12. // Keep a reference to the Taskbar instance
  13. private TaskbarManager windowsTaskbar = TaskbarManager.Instance;
  14. private JumpList childWindowJumpList;
  15. private string childWindowAppId;
  16. void ChildDocument_Shown(object sender, EventArgs e)
  17. {
  18. // Set our default
  19. windowsTaskbar.SetProgressState(TaskbarProgressBarState.NoProgress, this.Handle);
  20. }
  21. #region Progress Bar
  22. private void trackBar1_Scroll(object sender, EventArgs e)
  23. {
  24. // When the user changes the trackBar value,
  25. // update the progress bar in our UI as well as Taskbar
  26. progressBar1.Value = trackBar1.Value;
  27. windowsTaskbar.SetProgressValue(trackBar1.Value, 100, this.Handle);
  28. }
  29. private void comboBoxProgressBarStates_SelectedIndexChanged(object sender, EventArgs e)
  30. {
  31. // Update the status of the taskbar progress bar
  32. TaskbarProgressBarState state = (TaskbarProgressBarState)(Enum.Parse(typeof(TaskbarProgressBarState),
  33. (string)comboBoxProgressBarStates.SelectedItem));
  34. windowsTaskbar.SetProgressState(state, this.Handle);
  35. // Update the application progress bar,
  36. // as well disable the trackbar in some cases
  37. switch (state)
  38. {
  39. case TaskbarProgressBarState.Normal:
  40. if (trackBar1.Value == 0)
  41. {
  42. trackBar1.Value = 20;
  43. progressBar1.Value = trackBar1.Value;
  44. }
  45. progressBar1.Style = ProgressBarStyle.Continuous;
  46. windowsTaskbar.SetProgressValue(trackBar1.Value, 100, this.Handle);
  47. trackBar1.Enabled = true;
  48. break;
  49. case TaskbarProgressBarState.Paused:
  50. if (trackBar1.Value == 0)
  51. {
  52. trackBar1.Value = 20;
  53. progressBar1.Value = trackBar1.Value;
  54. }
  55. progressBar1.Style = ProgressBarStyle.Continuous;
  56. windowsTaskbar.SetProgressValue(trackBar1.Value, 100, this.Handle);
  57. trackBar1.Enabled = true;
  58. break;
  59. case TaskbarProgressBarState.Error:
  60. if (trackBar1.Value == 0)
  61. {
  62. trackBar1.Value = 20;
  63. progressBar1.Value = trackBar1.Value;
  64. }
  65. progressBar1.Style = ProgressBarStyle.Continuous;
  66. windowsTaskbar.SetProgressValue(trackBar1.Value, 100, this.Handle);
  67. trackBar1.Enabled = true;
  68. break;
  69. case TaskbarProgressBarState.Indeterminate:
  70. progressBar1.Style = ProgressBarStyle.Marquee;
  71. progressBar1.MarqueeAnimationSpeed = 30;
  72. trackBar1.Enabled = false;
  73. break;
  74. case TaskbarProgressBarState.NoProgress:
  75. progressBar1.Value = 0;
  76. trackBar1.Value = 0;
  77. progressBar1.Style = ProgressBarStyle.Continuous;
  78. trackBar1.Enabled = false;
  79. break;
  80. }
  81. }
  82. #endregion
  83. private void button1_Click(object sender, EventArgs e)
  84. {
  85. childWindowJumpList = JumpList.CreateJumpListForIndividualWindow(childWindowAppId, this.Handle);
  86. ((Button)sender).Enabled = false;
  87. groupBoxCustomCategories.Enabled = true;
  88. buttonRefreshTaskbarList.Enabled = true;
  89. }
  90. }
  91. }

首先获得程序的一个TaskbarManager对象,上面是调用TaskbarManager.Instance实现的,这是一个静态方法,得到windowsTaskbar对象。TaskbarManager有一个SetProgressValue方法,通过调用它就可以设置任务栏进度条的Value,他有多种重载方式,请参考说明文档。SetProgressState方法用来设置任务栏进度条的状态,共有5种状态NoProgress、Indeterminate、Normal、Error、Paused。

运行效果如下图:

win7 taskbar sample

当然还可以设置OverlayIcon、ThumbnailToolbar 、TabbedThumbnail 来美化我们的程序,在pack提供的sample中都有他们的使用例子。

最后一点,这种效果只有在win7或vista里才能使用(win8不知道,应该也行吧),所以在使用时要判断一下系统是不是支持。有三种方法,分别是:

  
  
  1. //方法一
  2. if (System.Environment.OSVersion.Version.Major >= 6) //make sure you are not on a legacy OS
  3. {
  4. //.........................
  5. }
  6. //方法二
  7. CoreHelpers.ThrowIfNotWin7();//不符合就return
  8. //方法三
  9. if(TaskbarManager.IsPlatformSupported)
  10. {
  11. //...................................
  12. }

国外参考资料:

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

作者:wuyuan 本文来自 Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2012/04/csharp-win7-taskbar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值