Click here to Skip to main content
Licence Ms-PL
First Posted 12 Mar 2010
Views 11,172
Bookmarked 20 times

Windows 7 Taskbar C# Quick Reference

By | 14 Mar 2010 | Technical Blog
Following are some listings to be used as a quick reference to common Windows 7 Taskbar features using Windows API Code Pack.
A Technical Blog article. View original blog here.[^]

Following are some listings to be used as a quick reference to common Windows 7 Taskbar features using Windows API Code Pack.

The code in this post is based on previous work by Yochay and Sasha.

Features

Setting the process Application ID

TaskbarManager.Instance.ApplicationId = "TaskbarManaged";

Note: This should be done before the window is shown, a good place is on form load.

Setting the Application ID of a window

TaskbarManager.Instance.SetApplicationIdForSpecificWindow(form.Handle, "SomethingElse");

or in WPF:

TaskbarManager.Instance.SetApplicationIdForSpecificWindow(wpfWindow, "SomethingElse");

Adding a file into the Recent category on the JumpList

 _jumpList = JumpList.CreateJumpList();

 ...

 _jumpList.AddToRecent(filePath);

Note: You must register (associate) the file type with your application for this to work. Note 2: If you use the common dialogs to open a file it will get added automatically to the recent list.

Adding tasks to the JumpList

IJumpListTask task1 = new JumpListLink(filePath, taskTitle)
{
    Arguments = arguments,
    WorkingDirectory = workingDirectory
};

IJumpListTask separator = new JumpListSeparator();
IJumpListTask task2 = ...

_jumpList.AddUserTasks(task1, separator, task2);
_jumpList.Refresh();

Adding custom categories

JumpListCustomCategory category = new JumpListCustomCategory("My Category");
_jumpList.AddCustomCategories(category);

IJumpListItem item1 = new JumpListLink(path1, title1);
IJumpListItem item2 = new JumpListLink(path2, title2);

category.AddJumpListItems(item1, item2);

Creating Thumbnail Toolbars

ThumbnailToolbarButton button1 = new ThumbnailToolbarButton(icon, tooltip);
button1.Click += delegate
{
    MessageBox.Show("button1 clicked");
};

TaskbarManager.Instance.ThumbnailToolbars.AddButtons(form.Handle, button1);

Setting Overlay Icon

TaskbarManager.Instance.SetOverlayIcon(icon, accessibilityText);

Setting Progress State and Value

TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal, form.Handle);
TaskbarManager.Instance.SetProgressValue(currentValue, maximumValue, form.Handle);

Customizing Live Thumbnail

TabbedThumbnail preview = new TabbedThumbnail(parentForm.Handle, childForm.Handle);
TaskbarManager.Instance.TabbedThumbnail.AddThumbnailPreview(preview);
preview.TabbedThumbnailBitmapRequested += (o, e) =>
    {
        Bitmap bmp = new Bitmap(width, height);
        
        // draw custom bitmap...
        
        e.SetImage(bmp);
        e.Handled = true;
    };

Extra Notes

A drawback in Windows API Code Pack v1.0.1

When using the Windows API Code Pack library to add Taskbar features to your WinForms application you must add a references to the following WPF DLLs: PresentationCore.dll, PresentationFramework and WindowsBase.dll

The reason is that every Taskbar function in the library that has an handle in its arguments comes in pair, the first expects a native IntPtr (used with myWinForm.Handle property) and the second expects a WPF Window object. Since we use a class that expects WPF types in its arguments (Taskbar) we must add the WPF DLLs to our WinForms project.

A Bug in Windows API Code Pack v1.0.1

ThumbnailToolbarButton Click event isn’t fired when process is running elevated (i.e. as Administrator)

The problem is that some of the taskbar messages doesn’t pass thru the Windows UIPI mechanism. A quick fix is to add the following line to the load event:

private void Form_Load(object sender, EventArgs eventargs)
{
    AllowTaskbarWindowMessagesThroughUIPI();
}

The definition of this method is brought here:

#region Fix bug in Windows API Code Pack

[DllImport("user32.dll", EntryPoint = "RegisterWindowMessage", SetLastError = true,
    CharSet = CharSet.Unicode)]
private static extern uint RegisterWindowMessage([MarshalAs(
    UnmanagedType.LPWStr)] string lpString);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr ChangeWindowMessageFilter(uint message, uint dwFlag);

private const uint MSGFLT_ADD = 1;
private const uint WM_COMMAND = 0x0111;
private const uint WM_SYSCOMMAND = 0x112;
private const uint WM_ACTIVATE = 0x0006;

/// <summary>
/// Specifies that the taskbar-related windows messages should
/// pass through the Windows UIPI mechanism even if the process is
/// running elevated. Calling this method is not required unless the
/// process is running elevated.
/// </summary>
private static void AllowTaskbarWindowMessagesThroughUIPI()
{
    uint WM_TaskbarButtonCreated = RegisterWindowMessage("TaskbarButtonCreated");

    ChangeWindowMessageFilter(WM_TaskbarButtonCreated, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_COMMAND, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_SYSCOMMAND, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_ACTIVATE, MSGFLT_ADD);
}

#endregion Fix bug in Windows API Code Pack

That’s it for now,
Arik Poznanski.

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)

About the Author

Arik Poznanski

Software Developer (Senior)
Sela Technology Center
Israel Israel

Member

Follow on Twitter Follow on Twitter
Arik Poznanski is a Senior Consultant and Instructor at Sela Technology Center. He completed two B.Sc. degrees in Mathematics & Computer Science, summa cum laude, from the Technion in Israel.
 
Arik has extensive knowledge and experience in many Microsoft technologies, including .NET with C#, WPF, Silverlight, WinForms, Interop, COM/ATL programming, C++ Win32 programming and reverse engineering (assembly, IL).

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
-- There are no messages in this forum --
Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120517.1 | Last Updated 14 Mar 2010
Article Copyright 2010 by Arik Poznanski
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid