web-dev-qa-db-fra.com

Barre de progression de Windows 7 dans la barre des tâches en C #?

Si vous avez remarqué dans la version bêta de Windows 7, si vous copiez des fichiers ou d'autres actions du système, l'icône de l'explorateur Windows dans la barre des tâches se remplira d'une barre de progression verte équivalente à la barre de progression du formulaire. Existe-t-il un moyen pour que, dans mes formulaires C #, je puisse forcer la barre de progression de la barre des tâches à correspondre à la progression de la tâche que je fais? Convertir, transférer, générer, cette barre de progression a de nombreuses utilisations.

67
CoreyOg

Je voulais simplement ajouter une animation de progression de la barre des tâches à mon application WinForms, Sans avoir à télécharger des packs de code ni à basculer vers WPF pour utiliser TaskbarItemInfo.

La solution était une classe qui utilise l'interface 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);
    }
}

Exemple de facilité d'utilisation:

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

or

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

Pour les personnes qui veulent éviter de lire la documentation et obtenir quelque chose qui fonctionne ...

  • Téléchargez le Pack de codes API Windows pour Microsoft .Net Framework .
  • Exécutez le programme d'installation qui crée un fichier Zip
  • Extrayez les DLL suivantes du dossier des fichiers binaires du fichier Zip:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • Ajoutez une référence à eux dans votre projet
  • Mettez le code suivant dans votre application et modifiez-le si nécessaire:

-

  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);
46
Mark Lakata
39
Armbrat

Oui, Microsoft a décrit les nouvelles fonctions de la barre des tâches dans le document suivant (sources incluses): Barre des tâches Windows 7: Ressources pour les développeurs

5
arul

Oui, vous devez utiliser cette API.

http://code.msdn.Microsoft.com/WindowsAPICodePack

4
Alex

J'ai trouvé un bel article ( Link ) qui fournit une solution simple au problème de la barre de progression de la barre des tâches. En résumé, il vous est demandé de télécharger le pack API Windows à partir du site Web MSDN , en ajoutant une référence au fichier Microsoft.WindowsAPICodePack.Shell.dll qu’il contient et en ajoutant trois lignes de code à votre application:

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

où X est la progression que vous souhaitez afficher.

0
blondii