Индикатор выполнения Windows 7 в панели задач на С#?

Если вы заметили в бета-версии Windows 7, если вы скопируете файлы или другие системные действия, значок проводника Windows на панели задач заполнит зеленую полосу прогресса, эквивалентную строке выполнения формы. Есть ли способ, что в моих С# -формах я могу заставить панель выполнения панели задач соответствовать прогрессу любой задачи, которую я выполняю? Преобразование, передача, генерация, так много применений для этого индикатора выполнения.

Ответ 1

Я просто хотел добавить некоторую анимацию прогресса панели задач в мое приложение WinForms, без необходимости загружать пакеты кода или переключаться в WPF для использования TaskbarItemInfo.

Решение было классом, который использует интерфейс ITaskbarList3:

using System;
using System.Runtime.InteropServices;

public static class TaskbarProgress
{
    public enum TaskbarStates
    {
        NoProgress    = 0,
        Indeterminate = 0x1,
        Normal        = 0x2,
        Error         = 0x4,
        Paused        = 0x8
    }

    [ComImport()]
    [Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    private interface ITaskbarList3
    {
        // ITaskbarList
        [PreserveSig]
        void HrInit();
        [PreserveSig]
        void AddTab(IntPtr hwnd);
        [PreserveSig]
        void DeleteTab(IntPtr hwnd);
        [PreserveSig]
        void ActivateTab(IntPtr hwnd);
        [PreserveSig]
        void SetActiveAlt(IntPtr hwnd);

        // ITaskbarList2
        [PreserveSig]
        void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen);

        // ITaskbarList3
        [PreserveSig]
        void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal);
        [PreserveSig]
        void SetProgressState(IntPtr hwnd, TaskbarStates state);
    }

    [ComImport()]    
    [Guid("56fdf344-fd6d-11d0-958a-006097c9a090")]
    [ClassInterface(ClassInterfaceType.None)]
    private class TaskbarInstance
    {
    }

    private static ITaskbarList3 taskbarInstance = (ITaskbarList3)new TaskbarInstance();
    private static bool taskbarSupported = Environment.OSVersion.Version >= new Version(6, 1);

    public static void SetState(IntPtr windowHandle, TaskbarStates taskbarState)
    {
        if (taskbarSupported) taskbarInstance.SetProgressState(windowHandle, taskbarState);
    }

    public static void SetValue(IntPtr windowHandle, double progressValue, double progressMax)
    {
        if (taskbarSupported) taskbarInstance.SetProgressValue(windowHandle, (ulong)progressValue, (ulong)progressMax);
    }
}

Пример того, как легко использовать:

TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Indeterminate);

or

TaskbarProgress.SetValue(this.Handle, 50, 100);
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Error);

Ответ 2

Для людей, которые хотят пропустить чтение документации и просто получить что-то, что работает...

  • Загрузите Код кода Windows для Microsoft.Net Framework.
  • Запустите установщик, который создает zip файл
  • Извлеките следующие DLL из папки двоичных файлов zip файла:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • Добавьте ссылку на них в свой проект
  • Вставьте следующий код в свое приложение и при необходимости измените:

-

  int max = 100;
  var prog = Microsoft.WindowsAPICodePack.Taskbar.TaskbarManager.Instance;
  prog.SetProgressState(Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.Normal);
  for(int i=0;i<max;i++) {
     prog.SetProgressValue(i, max);
     Thread.Sleep(100);     
  }
  prog.SetProgressState(Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.NoProgress);

Ответ 6

Я нашел красивую статью (Ссылка), которая обеспечивает простое решение проблемы с панелью задач панели задач. Вкратце, он инструктирует вас загрузить пакет API Windows с веб-сайта MSDN, добавив ссылку на файл Microsoft.WindowsAPICodePack.Shell.dll, который он содержит и, наконец, добавляет три строки кода в ваше приложение:

Imports Microsoft.WindowsAPICodePack
Imports Microsoft.WindowsAPICodePack.Taskbar
// ...
TaskbarManager.Instance.SetProgressValue(X, 100)

где X - это прогресс, который вы хотите отобразить.