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

eqqqjvef  于 2022-12-24  发布在  .NET
关注(0)|答案(5)|浏览(133)

Windows 7有一个令人敬畏的新功能,即应用程序可以通过状态栏报告当前活动的进度。例如,当使用Windows资源管理器复制文件时,进度栏会分层显示在任务栏中应用程序图标的顶部,并在更新时显示进度。
显示进度条的API是什么?有关于它的MSDN文档吗?

smtd7mpg

smtd7mpg1#

适用于.NET 4以下版本或任何.NET版本中的WinForms

使用微软的Windows API Code Pack(正如Keeron提到的),这真的很简单。你只需要使用TaskbarManager
要启动进程:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal);

要更新进度:

TaskbarManager.Instance.SetProgressValue(currentValue, maxProgressValue);

当你完成的时候,结束这个过程:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);

你还可以做更多的事情,但这应该让你开始,可能是你所需要的。

适用于带WPF的.NET 4及更高版本

您可以使用System.Windows.Shell.TaskbarItemInfo。例如,在主窗口的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;

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

5hcedyr0

5hcedyr02#

MSDN杂志上有一篇关于the new taskbar APIs的好文章。是的,这个特性很棒:-)
从本质上讲,这都是关于实现IFileOperation的,有一篇很好的文章是关于在托管代码here中使用它的。

zsbz8rwp

zsbz8rwp3#

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

uqdfh47h

uqdfh47h4#

我写过一篇关于用C#实现Windows 7任务栏进度API的文章(请参见:该控件是开源的(BSD),并且具有针对C#和VB.NET的示例项目。
这样你就不必从头开始转换C++代码了。

8yoxcaq7

8yoxcaq75#

实际上我使用Telerik的RadWindow,你不能只使用<telerik:RadWindow.TaskbarItemInfo>。所以我使用这个net6.0-windows WPF的解决方案:
在代码隐藏文件中,我创建了一个属性:

public Lazy<TaskbarItemInfo> TaskbarItemInfo { get; set; } = new Lazy<TaskbarItemInfo>(() => 
{
   return System.Windows.Application.Current.MainWindow.TaskbarItemInfo = new TaskbarItemInfo(); 
});

BackgroundWorker的方法部分中

private void WorkerProgressChanged(object sender, ProgressChangedEventArgs e)

我设置进度的值:

TaskbarItemInfo.Value.ProgressState = TaskbarItemProgressState.Normal;
TaskbarItemInfo.Value.ProgressValue = (double)progressUserState.ProgressInPercent / 100;

private void WorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

我重新设置状态:

TaskbarItemInfo.Value.ProgressValue = 0;
TaskbarItemInfo.Value.ProgressState = TaskbarItemProgressState.None;

相关问题