Как закодировать индикатор выполнения для Windows 7, чтобы также обновить себя на панели задач?

В Windows 7 появилась новая функция AWESOME, которую приложения могут сообщать о ходе текущей деятельности через строку состояния. Например, при копировании файлов (ов) с помощью Проводника Windows панель выполнения помещается поверх значка приложения на панели задач, и прогресс показывается по мере обновления.

Что такое API для отображения индикатора выполнения? Есть ли в нем документация MSDN?

Ответы

Ответ 1

В журнале MSDN есть хорошая статья о о новых API-интерфейсах панели задач. И да, функция потрясающая: -)

По сути, это все о внедрении IFileOperation. Там хорошая статья об использовании его в управляемом коде здесь.

Ответ 2

Для ниже .NET 4 или WinForms в любой версии .NET

Используя Код кода Windows API от Microsoft (как упоминал Кирон), это действительно просто. Вам просто нужно использовать TaskbarManager. Например.

Чтобы начать выполнение:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal);

Чтобы обновить ход выполнения:

TaskbarManager.Instance.SetProgressValue(currentValue, maxProgressValue);

И когда вы закончите, выполните следующие действия:

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);

Больше вы можете сделать, но это должно заставить вас начать и, возможно, все, что вам нужно.

Для .NET 4 и выше с WPF

Вы можете использовать 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;

Не забывайте, что если вы выполняете "работу" в фоновом потоке (что, вероятно, является хорошей идеей для длительных задач), вам нужно будет вернуться к потоку пользовательского интерфейса, чтобы обновить панель задач.

Ответ 3

Если вы планируете использовать другие функции панели задач Windows 7, другой подход состоял бы в использовании библиотеки Microsoft: Windows API Code Pack для .NET Framework, которая больше не доступна в старая ссылка, но ее можно найти на nuget.

Ответ 4

Я написал статью о реализации API прогресса панели задач Windows 7 в С# (см.: Панель прогресса панели задач Windows 7 с С# и .NET). Элемент управления является открытым исходным кодом (BSD) и имеет примеры проектов для С# и VB.NET.

Таким образом, вам не нужно преобразовывать код С++ с нуля.