如何编写Windows 7的进度条以在任务栏上更新自己?

Goy*_*uix 23 .net c# c++ windows-7

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

用于公开进度条的API是什么?是否有MSDN文档?

Wil*_*lka 39

对于.NET 4以下版本,或任何.NET版本的WinForms

使用Microsoft 的Windows API代码包(如Keeron所提到的),它非常简单.你只需要使用TaskbarManager.例如

要开始进步:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal);
Run Code Online (Sandbox Code Playgroud)

要更新进度:

TaskbarManager.Instance.SetProgressValue(currentValue, maxProgressValue);
Run Code Online (Sandbox Code Playgroud)

当你完成时,结束进度:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);
Run Code Online (Sandbox Code Playgroud)

你可以做的更多,但这应该让你开始,可能就是你所需要的.

对于带有WPF的.NET 4及更高版本

您可以使用System.Windows.Shell.TaskbarItemInfo.例如,在主窗口的Xaml中,您需要添加:

<Window.TaskbarItemInfo>
    <TaskbarItemInfo x:Name="taskBarItemInfo" />
</Window.TaskbarItemInfo>
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

不要忘记,如果你在后台线程上做"工作"(对于长时间运行的任务可能是一个好主意),你需要切换回UI线程来更新任务栏.

  • Windows API CodePack链接是一个断开的链接,它仍可从nuget获得,但http://www.nuget.org/packages/Microsoft.WindowsAPICodePack-Core/ (4认同)

sig*_*int 12

MSDN杂志中有一篇关于新任务栏API的文章.是的,功能很棒:-)

从本质上讲,这都是关于实施的IFileOperation.有一个关于在托管代码中使用它的好文章在这里.


小智 5

如果您计划使用其他Windows 7任务栏功能,另一种方法是使用Microsoft的库:用于.NET Framework的Windows API代码包,旧链接不再提供,但可以在nuget找到.