Barra de progreso de Windows 7 en la barra de tareas en C#?
windows-7 progress-bar (6)
Encontré un hermoso artículo ( Link ) que proporciona una solución simple al problema de la barra de progreso de la barra de tareas. En resumen, le indica que descargue el paquete de API de Windows del sitio web de MSDN , agregue una referencia al archivo Microsoft.WindowsAPICodePack.Shell.dll que contiene y, finalmente, agregue tres líneas de código a su aplicación:
Imports Microsoft.WindowsAPICodePack
Imports Microsoft.WindowsAPICodePack.Taskbar
// ...
TaskbarManager.Instance.SetProgressValue(X, 100)
donde X es el progreso que desea visualizar.
Si ha notado en la versión beta de Windows 7, si copia archivos u otras acciones del sistema, el ícono del explorador de Windows en la barra de tareas se llenará con una barra de progreso verde equivalente a la barra de progreso en el formulario. ¿Hay alguna forma de que, en mis formularios C #, pueda forzar la barra de progreso de mi barra de tareas para que coincida con el progreso de cualquier tarea que esté haciendo? Convirtiendo, transfiriendo, generando, hay tantos usos para esa barra de progreso.
Para las personas que quieren omitir la lectura de la documentación y obtener algo que funcione ...
- Descargue el paquete de códigos API de Windows para Microsoft .Net Framework .
- Ejecute el instalador que crea un archivo zip
- Extraiga los siguientes dlls de la carpeta binarios del archivo zip:
-
Microsoft.WindowsAPICodePack.dll
-
Microsoft.WindowsAPICodePack.Shell.dll
-
- Agregue una referencia a ellos en su proyecto
- Coloque el siguiente código en su aplicación y modifíquelo según sea necesario:
-
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);
Sí, Microsoft cubrió las nuevas funciones de la barra de tareas en el siguiente documento (fuentes incluidas): Barra de tareas de Windows 7: Recursos del desarrollador
Sí, necesitas usar esta API.
Solo quería agregar una animación de progreso de la barra de tareas a mi aplicación WinForms, sin tener que descargar paquetes de códigos o cambiar a WPF para usar TaskbarItemInfo.
La solución fue una clase que usa la interfaz 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);
}
}
Ejemplo de lo fácil que es usar:
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Indeterminate);
or
TaskbarProgress.SetValue(this.Handle, 50, 100);
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Error);