Progreso en la barra de taréas de Windows 7 con C#

Seguramente a estas alturas todos habréis trabajado, o al menos visto, Windows 7. Una de las cosas que primero se notan son los cambios que han introducido en la barra de tareas.

Una característica bastante útil es poder ver el progreso (de descargas, de impresión, etc…) en el propio icono de la aplicación. Hacer que vuestras aplicaciones usen esas características desde C# es sencillísimo con la librería Windows API Code Pack.

Una vez descargado el código deberás compilarlo y añadir la dll como referencia a tu proyecto.

Haré un ejemplo muy simple, una aplicación Windows Forms con una barra de progreso y una etiqueta que mostrará (sorpresa!) el porcentaje. La idea es que en la barra de tareas también se muestre el progreso.

Lo primero es acceder a la clase que se encarga de todas estas cosas, TaskbarManager:

private TaskbarManager _windowsTaskbar = TaskbarManager.Instance;

Preparamos un método que incremente en una unidad nuestra variable y actualice el estado de la barra de progreso, la etiqueta y el progreso de la barra de taréas:

        private void incrementPercent()
        {
            lbPercent.Text = (progressBar.Value = ++_percent) + "%";
            _windowsTaskbar.SetProgressValue(_percent,100);            
        }

Para fingir el avance del progreso usaré un Timer que avanzará un 1% cada 100ms (es lo que pone por defecto VS 2008):

        private void timer_Tick(object sender, EventArgs e)
        {
            if (_percent < 100)
                incrementPercent();
            else
            {
                timer.Stop();
                _windowsTaskbar.SetProgressState(TaskbarProgressBarState.Indeterminate);
            }
        }

Como podéis ver, el método de incrementar el porcentaje se llama hasta que se alcanza el 100% momento en el que el timer se para y la barra de tareas se fija en “indeterminado”. Podéis experimentar con los diversos estados que tiene, lo normal sería fijarla en NoProgress, es decir, que después de 100% vuelva al estado normal, pero me apetecía experimentar :P

Lógicamente para que todo esto funcione, habría que iniciar el timer al principio de la ejecución y declarar la variable _percent. Así es como me ha quedado a mi:

progressSi queréis, podéis descargaros el código fuente ;)

About the Author

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P