2009-08-18 20 views
62

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.Barra de progreso de Windows 7 en la barra de tareas en C#?

Respuesta

44

Para las personas que quieren dejar de leer la documentación y acaba de obtener algo que funciona ...

  • Descargue el Windows API Code Pack for Microsoft .Net Framework.
  • ejecutar el instalador que crea un archivo zip
  • Extracto de los siguientes archivos DLL de la carpeta de archivos binarios del archivo zip:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • Añadir una referencia a ellos en su proyecto
  • Ponga 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); 
+0

La descarga Nuget es un poco molesto, pero sí, funciona muy bien. Implementado en mi clase de controlador de barra de progreso :) – Nyerguds

0

He encontrado un artículo hermoso (Link) que proporciona una solución sencilla al problema barra de progreso barra de tareas. En resumen, se le indica que debe descargar el paquete de API de Windows from the MSDN website, añadiendo una referencia a la Microsoft.WindowsAPICodePack.Shell.dll que contiene, y por último añadir tres líneas de código para su aplicación:

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

donde X es el progreso que desea mostrar.

+2

Tenga en cuenta que [se desaconsejan las respuestas solo de enlace] (http://meta.stackoverflow.com/tags/link-only-answers/info), entonces las respuestas deberían ser el punto final de una búsqueda de una solución (frente a otra escala más de referencias, que tienden a quedar obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

58

Sólo quería añadir algo de animación de progreso barra de tareas para mi aplicación WinForms, sin tener que descargar los paquetes de código o cambiar a WPF usar TaskbarItemInfo.

La solución era una clase que utiliza 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); 
+3

Esta es una respuesta increíblemente fantástica; no hay dependencias o descargas externas, y solo funciona – Ben

+1

Si desea agregar SetOverlayIcon, como lo hice, asegúrese de agregar todos los métodos adicionales * en el orden correcto *. Consulte la respuesta aceptada para http://stackoverflow.com/questions/1024786/windows-7-taskbar-setoverlayicon-from-wpf-app-doesnt-work –

+0

Desafortunadamente, esto rompe la aplicación cuando se ejecuta en Windows XP. ¿Alguna solución? –

Cuestiones relacionadas