文档章节

C#语言操作Win7系统任务栏(TaskBar)中程序图标的背景进度条

北风其凉
 北风其凉
发布于 2016/07/22 11:55
字数 894
阅读 560
收藏 4

一、问题描述

在使用火狐浏览器(47.0.1)下载文件时,我注意到我的Win7系统任务栏火狐程序图标的背景部分会变成一个进度条,实时展示下载进度。

于是我想了下怎么用C#语言实现这个功能,也上网查了些资料。后来我发现问题并不像我想的这么简单,因为这个功能并不存在于.NET Framework中,而是被放在一组专门的库中,库的名字叫:Windows API Code Pack for Microsoft .NET Framework

参考文章:Windows API Code Pack for Microsoft .NET Framework

https://blogs.msdn.microsoft.com/windowssdk/2009/06/12/windows-api-code-pack-for-microsoft-net-framework/

二、下载相关库文件

Windows API Code Pack 似乎已经很难被找到,后来我在这个stackoverflow的问题里找到了下载地址:

http://stackoverflow.com/questions/24081665/windows-api-code-pack-where-is-it

这个问题中给出了一组下载地址:

1、https://www.nuget.org/packages/WindowsAPICodePack-Core

2、https://www.nuget.org/packages/WindowsAPICodePack-ExtendedLinguisticServices

3、https://www.nuget.org/packages/WindowsAPICodePack-Sensors

4、https://www.nuget.org/packages/WindowsAPICodePack-Shell

5、https://www.nuget.org/packages/WindowsAPICodePack-ShellExtensions

nuget.org 给出的方法是使用 Package Manager Console 安装库,不过我后来还是决定直接下载dll,用简单粗暴的方法来实现我要做的功能。

Windows API Code Pack 1.1.zip 下载地址在:

https://github.com/jamie-pate/KeepSync/blob/master/contrib/Windows%20API%20Code%20Pack%201.1.zip

三、添加引用

我使用的VS版本为VS2012,.NET Framework版本为4.5。

使用 Visual Studio 建立一个C#窗体应用程序的解决方案。

解决方案建立完毕后需要添加6个引用:

1、Microsoft.WindowsAPICodePack.dll、Microsoft.WindowsAPICodePack.Shell.dll 需要我们从之前下载的 Windows API Code Pack 中引入

2、PresentationCore.dll 如果没有需要我们另行下载,这里给出一个下载地址:

http://www.121down.com/soft/softview-33650.html

3、PresentationFramework、System.Xaml、WindowsBase 都可以直接在添加引用界面的引用列表中选择并添加

这六个引用如下图所示,其中需要下载的用绿色矩形标记,可直接添加引用的用红色矩形标记。

四、绘制界面

界面控件如下图所示:

五、编写代码

编写代码时,需要手动添加命名空间:

1、Microsoft.WindowsAPICodePack.Shell

2、Microsoft.WindowsAPICodePack.Taskbar

通过设置状态、设置进度两个按钮,实现对状态栏中图标进度条的控制:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//需要添加的命名空间
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Taskbar;

namespace WindowsAPICodePackTest
{
    public partial class FormMain : Form
    {
        private TaskbarManager windowsTaskbar = TaskbarManager.Instance;

        public FormMain()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Load函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMain_Load(object sender, EventArgs e)
        {
            //初始化界面和进度条
            cmbProgressStatus.Text = "Normal";
            windowsTaskbar.SetProgressState(TaskbarProgressBarState.Normal, this.Handle);
            windowsTaskbar.SetProgressValue(0, 100, this.Handle);
        }

        /// <summary>
        /// 设置进度条进度
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSetProgress_Click(object sender, EventArgs e)
        {
            int progress = 0;
            int.TryParse(txtProgress.Text, out progress);
            progress = progress < 0 ? 0 : progress;
            progress = progress > 100 ? 100 : progress;
            //设置进度条进度
            windowsTaskbar.SetProgressValue(progress, 100, this.Handle);
        }

        /// <summary>
        /// 设置进度条状态
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSetProgressStatus_Click(object sender, EventArgs e)
        {
            TaskbarProgressBarState progressState = TaskbarProgressBarState.Normal;
            switch (cmbProgressStatus.Text)
            {
                case "NoProgress":
                    {
                        progressState = TaskbarProgressBarState.NoProgress;
                    }
                    break;
                case "Indeterminate":
                    {
                        progressState = TaskbarProgressBarState.Indeterminate;
                    }
                    break;
                case "Normal":
                    {
                        progressState = TaskbarProgressBarState.Normal;
                    } 
                    break;
                case "Error":
                    {
                        progressState = TaskbarProgressBarState.Error;
                    }
                    break;
                case "Paused":
                    {
                        progressState = TaskbarProgressBarState.Paused;
                    }
                    break;
            }
            windowsTaskbar.SetProgressState(progressState, this.Handle);
        }
    }
}

六、运行效果

上面DEMO程序的运行效果如下图:

1、进度条状态为TaskbarProgressBarState.Normal时,进度条为绿色,可用于展示正常状态

2、进度条状态为TaskbarProgressBarState.Pause时,进度条为黄色,可用于展示暂停状态

3、进度条状态为TaskbarProgressBarState.Error时,进度条为红色,可用于展示错误状态

七、DEMO工程下载

下载地址:http://pan.baidu.com/s/1hsyh3FY

END

© 著作权归作者所有

北风其凉

北风其凉

粉丝 118
博文 498
码字总数 463468
作品 4
朝阳
程序员
私信 提问
Windows 7 任务栏开发 之 进度条(Progress Bar)

上一篇我们完成了“覆盖图标”(Overlay Icon)的相关开发,本篇我们将对进度条特性进行研究。在使用IE 下载文件时,任务栏图标会同步显示当前下载进度(如下图)。那么在应用程序中如何实现...

junwong
2012/03/09
707
0
WPF 4 开发Windows 7 任务栏(Overlay Icon、Thumbnail Toolbar、Progress Bar)

在上一篇我们介绍了如何在WPF 4 中开发Windows 7 跳转列表,本篇将继续针对WPF 4 中任务栏其他功能:覆盖图标(Overlay Icon)、进度条(Progress Bar)、缩略图工具栏(Thumbnail Toolbar)...

junwong
2012/03/09
733
0
Windows 7 任务栏开发 之 覆盖图标(Overlay Icon)

当第一次使用Windows 7 时,任务栏(Taskbar)的改变可以说让我眼前一亮。在以前版本Windows 桌面功能的基础上,Windows 7 任务栏为我们增添了许多其他功能:Jump Lists,Window Preview,P...

junwong
2012/03/09
497
0
Windows 7 任务栏开发 之 跳转列表(Jump Lists)

本篇我们开始介绍任务栏的另一个亮点:跳转列表(Jump Lists,下文简称JL)。JL 可以使用户方便快捷的找到想要浏览的文件(文档、图片、音频或视频等)以及应用程序的链接或快捷方式。以IE ...

junwong
2012/03/09
161
0
Windows 任务栏增强工具推荐,让任务栏更好用

前言 Windows 的任务栏作为桌面常驻项目,一般用作固定图标和切换程序等使用。 我们还可以通过一些任务栏增强小工具,使任务栏具备更多更实用的功能,发挥更大的作用,也让我们的操作更加方便...

己立
2018/10/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最新【从零单排】系列流出,教你如何实现字典存储结构

昨天在星球的【从零单排】系列分享了一篇【字典存储结构的实现方式】,我觉得这篇文章写的还是蛮好的,就分享给大家了。 但由于篇幅太长了,微信没办法全部传上来,如果你觉得内容还不错,想...

上海小胖
34分钟前
0
0
JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
今天
5
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
5
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
11
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部