Этой функциональностью панели задач активно пользуются различные приложения. Например, Windows Media Player отображает опции переключения плейлистов. Internet Explorer и Windows Explorer содержат в jump lists с сылками на последние места, куда вы заходили. Windows Live Messanger отображает опции переключения состояния.

В jump list могут присутствовать несколько различных типов элементов: задачи, ссылки на последние открытые документы и ссылки на постоянные документы. Кроме того, эти позиции могут быть закреплены. Такие элементы не исчезнут из jump list со временем. Это удобно, например, если мы часто работаем с одним и тем же документом. Схематично jump list можно представить следующим образом.

По сути, каждый пункт в jump list представляет собой ссылку на программу или файл. Так, например, мы можем запустить калькулятор, или какой-либо документ заданного формата. К сожалению, у нас нет возможности напрямую перехватить событие нажатия на пункт в jump list. Каждый раз, когда мы выбираем очередной пункт будет запускаться новый экземпляр приложения. Это связано в первую очередь с тем, что jump list можно вызвать даже тогда, когда приложение не запущено. В этом случае оно должно быть закреплено (pinned) на панели задач. Например, на следующем рисунке видно, что Internet Explorer в данный момент не запущен, но jump list мы открыть можем.

Итак, давайте посмотрим каким образом подобная функциональность может быть реализована в наших приложениях. Для работы с jump list нам понадобится объект типа JumpListManager, который входит в состав .NET Interop Sample Library. Создавать его необходимо в момент создания кнопки нашего приложения на панели задач. Для этих целей можно переопределить метод WndProc следующим образом.
protected override void WndProc(ref Message m)
{
if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage)
{
_jumpListManager = WindowsFormsExtensions.CreateJumpListManager(this);
_jumpListManager.UserRemovedItems += (o, e) =>
{
e.CancelCurrentOperation = false;
};
// add items
_jumpListManager.Refresh();
}
base.WndProc(ref m);
}Обратите внимание на вызов метода Refresh после создания объекта JumpListManager. Вызов этого метода необходим для обновления позиций в jump list. Также обязательным действием является подписка на событие UserRemovedItems. Оно исполняется когда производится попытка удаления устаревших пунктов из jump list. Давайте теперь попробуем добавить новые позиции в jump list. Для этих целей существуют классы-обертки и нужные методы у объекта JumpListManager.
Самый простой тип позиций в jump list – задачи. Задачей может быть запуск внешнего приложения или нашего приложения с какими-то параметрами. В WLM в виде задач реализовано переключение состояния пользователя. Для создания задачи в jump list используется метод AddUserTask.
_jumpListManager.AddUserTask(new ShellLink
{
Path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "calc.exe"),
Title = "Calculator",
Category = "Applications",
IconLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "calc.exe"),
IconIndex = 0
});Как видим, здесь создается новый объект типа ShellLink, в который передается путь до приложения, заголовок и значок. Я добавил в свое приложение две задачи и получил следующий результат.

Другой вариант заполнения jump list – ссылки на документы, которые были загружены ранее. Для этих целей я создал несколько текстовых файлов с расширением “.myapp” и ассоциировал этот тип файлов со своим приложением. При запуске приложения я проверяю передано ли имя файла в качестве параметра при запуске приложения. Если имя задано, то я считываю этот файл и добавляю его в список ранее загруженных файлов. Для этих целей существует метод AddToRecent.
if (File.Exists(Environment.GetCommandLineArgs().Skip(1).FirstOrDefault() ?? String.Empty) == true)
{
_jumpListManager.AddToRecent(Environment.GetCommandLineArgs().Skip(1).FirstOrDefault() ?? String.Empty);
}Теперь из Windows Explorer я открою эти файлы. При этом будет запускаться мое демонстрационное приложение (если мы правильно ассоциировали данный тип файлов с приложением). При этом при вызове jump list я увижу, что в категории “Recent” появились ссылки на ранее открытые файлы.

Я могу закрепить те позиции, с которыми я работаю чаще всего. В этом случае я смогу быстро открывать нужные мне документы через jump list.

Другой способ размещения позиций в jump list – создание ссылок на постоянные документы/программы. В этом случае мы также можем сгруппировать эти позиции по категориям. Для этих целей существует метод AddCustomDestination.
_jumpListManager.AddCustomDestination(new ShellLink
{
Path = @"about.txt",
Title = "About",
Category = "My application",
IconLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll"),
IconIndex = 11
});Я добавил несколько таких ссылок в jump list и получил следующий результат.

На этом рисунке видно, что появились две дополнительные группы со ссылками внутри.
Замечательной особенностью jump list является то, что его содержимое также доступно в меню “Пуск”. Так, например, если мы активно пользуемся этой функциональностью, то это можно использоваться и из стартового меню.

Таким образом мы можем использовать дополнительную функциональность, которую нам предоставляет панель задач Windows 7 для обеспечения максимально комфортной работы пользователя.
Демонстрационное приложение:
Taskbar-JumpLists.zip

