Пользователь
0,0
рейтинг
4 июня 2009 в 09:32

Программируем Windows 7: Taskbar. Часть 10 (заключительная) – JumpLists

Одной из важнейших функций панели задач в Windows 7 являются Jump Lists. Jump lists отображаются, если выделить значок приложения в панели задач и нажать правую кнопку мыши. Если приложение использует функциональность JumpLists, то кроме стандартных действий (pin, close) появятся еще ряд дополнительных действий, которые облегчают нашу повседневную работу.

Этой функциональностью панели задач активно пользуются различные приложения. Например, 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

На этом я завершаю серию статей, посвященных программированию панели задач для Windows 7. Надеюсь эта информация окажется полезной для вас и ваших приложений. Хочу особенно отметить, что реализация возможностей панели задач Windows 7 для ваших приложений не потребует много усилий, но результат не заставит себя долго ждать – общаться с вашим приложением будет гораздо приятнее и удобнее.

Успехов вам в построении ваших приложений для Windows7!
Сергей Звездин @Sergun
карма
72,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (12)

  • НЛО прилетело и опубликовало эту надпись здесь
  • +5
    Блин жаль… всегда ждал с нетерпением следующую часть.
  • 0
    Спасибо. Сделал бы кто мини-приложение, по аналогии с квик ланчем.
    А то некоторые редко используемые приложения зря жрут место на панели.
    • 0
      quick launch есть в Windows 7
      только он по умолчанию отключен
      но при желании включить всегда можно
      • +1
        Так и есть, но он ущербен интерфейсу в некотором роде.
      • 0
        Я включил… Но с недавних времен продпадает после каждой перезагрузки. Почему — ума не приложу…
    • 0
      А вы их в пуск засунте… Он для этого и предназначен.
  • 0
    Картинки! Верните картинки! Пожалуйста!
    • +1
      с ними вроде все в порядке.
  • 0
    Непонятно только как делать это для WPF… понимаю что в WPF 4 все будет поддерживаться, а что делать пока?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.