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.
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);
Pour les personnes qui veulent éviter de lire la documentation et obtenir quelque chose qui fonctionne ...
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);
Examinez le Windows API Code Pack pour Microsoft .Net Framework .
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
Oui, vous devez utiliser cette API.
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.