C# 如何为Windows 7编写进度条,使其在任务栏上也能自我更新?

C# 如何为Windows 7编写进度条,使其在任务栏上也能自我更新?,c#,.net,c++,windows-7,C#,.net,C++,Windows 7,Windows7有一个很棒的新功能,应用程序可以通过状态栏报告当前活动的进度。例如,当使用Windows资源管理器复制文件时,进度条会层叠在任务栏中应用程序图标的顶部,并在更新时显示进度 公开进度条的API是什么?有关于它的MSDN文档吗?MSDN杂志上有一篇关于它的好文章。是的,这个功能非常棒:-) 本质上,这一切都是关于实现IFileOperation。有一篇关于在托管代码中使用它的好文章。我写了一篇关于在C#中实现Windows 7任务栏进度API的文章(请参阅:)。该控件是开源(BSD)

Windows7有一个很棒的新功能,应用程序可以通过状态栏报告当前活动的进度。例如,当使用Windows资源管理器复制文件时,进度条会层叠在任务栏中应用程序图标的顶部,并在更新时显示进度


公开进度条的API是什么?有关于它的MSDN文档吗?

MSDN杂志上有一篇关于它的好文章。是的,这个功能非常棒:-)


本质上,这一切都是关于实现
IFileOperation
。有一篇关于在托管代码中使用它的好文章。

我写了一篇关于在C#中实现Windows 7任务栏进度API的文章(请参阅:)。该控件是开源(BSD)的,并且有C#和VB.NET的示例项目


这样,您不必从C++中转换C++代码。

如果您计划使用其他Windows 7任务栏特性,另一种方法是使用来自微软的.Windows API代码包.NET框架,该框架不再可用,但可以在.NET中找到。

< P> <强>下面的.NET 4,或任何.NET版本的WinForms

使用微软的软件(正如Keeron提到的),它非常简单。您只需使用
TaskbarManager
。例如

要开始进度,请执行以下操作:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal);
TaskbarManager.Instance.SetProgressValue(currentValue, maxProgressValue);
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);
要更新进度,请执行以下操作:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal);
TaskbarManager.Instance.SetProgressValue(currentValue, maxProgressValue);
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);
完成后,要结束进度:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal);
TaskbarManager.Instance.SetProgressValue(currentValue, maxProgressValue);
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);
你还可以做更多的事情,但这应该能让你开始,也许就是你所需要的

适用于带有WPF的.NET 4及以上版本

你可以用。例如,在主窗口的Xaml中,您需要添加:

<Window.TaskbarItemInfo>
    <TaskbarItemInfo x:Name="taskBarItemInfo" />
</Window.TaskbarItemInfo>

然后,要更新进度,您可以执行以下操作:

taskBarItemInfo.ProgressState = TaskbarItemProgressState.Normal;

for (int i = 0; i < 100; i++)
{
    taskBarItemInfo.ProgressValue = i / 100.0;
    Thread.Sleep(50); // whatever the 'work' really is
}

taskBarItemInfo.ProgressState = TaskbarItemProgressState.None;
taskBarItemInfo.ProgressState=TaskbarItemProgressState.Normal;
对于(int i=0;i<100;i++)
{
taskBarItemInfo.ProgressValue=i/100.0;
Thread.Sleep(50);//不管“工作”到底是什么
}
taskBarItemInfo.ProgressState=TaskbarItemProgressState.None;

不要忘记,如果您在后台线程上执行“工作”(这对于长时间运行的任务可能是个好主意),则需要切换回UI线程以更新任务栏。

您的第二个链接似乎已断开,我将链接改为archive.org。Windows API代码包链接已断开,尽管答案和注释中链接的包实际上并不包含所需的类,但它仍然可以从nuget获得。该类在Shell包中:我花了一段时间才发现,当“系统属性>高级>性能选项>视觉效果”中禁用“任务栏和开始菜单中的动画”选项时,“不确定”无效。记住这一点也很重要。ProgressValue以0到1的分数运行