How do you show progress in the Taskbar with Winform C# 4.5

TaskbarItemInfo doesn't do anything by itself. It needs a window which is represented on the taskbar. Note that one normally gets an instance of TaskbarItemInfo from an instance of a WPF Window. I.e. that class is intended for use in WPF programs, not Winforms.

For a Winforms program, you may find it is more practical to use the Windows API Codepack, which if I recall correctly has support for this Shell feature.

You can use the TaskbarManager class in WindowsAPICodePack.Taskbar to set the Form Window's task bar progress like this:

using Microsoft.WindowsAPICodePack.Taskbar;
...
private void Form1_Load(object sender, EventArgs e)
{
    TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Error, Handle);
    TaskbarManager.Instance.SetProgressValue(40, 100, Handle);
}

Using the current Form's .Handle to tell the manager to which window this feature should be provided. You can use a public static pointer reference from another form, too, if you wish to handle its progress in the same place.

Unfortunately, for some reason Microsoft is no longer hosting a download for this, in spite of the continued relevance for the library. But here is a StackOverflow Q&A with numerous other links for the same library: Windows API Code Pack: Where is it?. Note that there are two versions, 1.0 and 1.1. In general, you will likely prefer the 1.1 version; it has numerous bug fixes, added features, and much better Fxcop compliance. The link I've provided is for 1.1, but there are links for downloading 1.0 on that SO article as well.


Here's a short example that you should be able to use to tailor to your needs:

    System.Windows.Window w = new System.Windows.Window();
    w.TaskbarItemInfo = new System.Windows.Shell.TaskbarItemInfo() { ProgressState = System.Windows.Shell.TaskbarItemProgressState.Normal };
    w.Loaded += delegate {
        Action<Object> callUpdateProgress = (o) => {
            w.TaskbarItemInfo.ProgressValue = (double) o;
        };

        Thread t = new Thread(() => {
            for (int i = 1; i <= 10; i++) {
                w.Dispatcher.BeginInvoke(callUpdateProgress, 1.0 * i / 10);
                Thread.Sleep(1000);
            }
        });
        t.Start();
    };

    System.Windows.Application app = new System.Windows.Application();
    app.Run(w);