Программируем панель задач Windows 7 (ч.10)
Одной из важнейших функций панели задач в Windows 7 являются так называемые списки переходов или Jump Lists. Списки переходов отображаются, если выделить значок приложения в панели задач и нажать правую кнопку мыши. Если приложение использует функциональность списков переходов, то кроме стандартных действий (закрепить и закрыть) появятся еще ряд дополнительных действий, которые облегчают нашу повседневную работу.
Этой функциональностью панели задач активно пользуются различные приложения. Например, Windows Media Player отображает опции переключения плейлистов. Internet Explorer и Windows Explorer содержат в списке переходов ссылки на места, которые вы посещали недавно. Windows Live Messenger отображает опции переключения состояния.
В списке перехода могут присутствовать несколько различных типов элементов: задачи, ссылки на последние открытые документы и ссылки на постоянные документы. Кроме того, эти позиции могут быть закреплены. Такие элементы не исчезнут из списка переходов со временем. Это удобно, например, если мы часто работаем с одним и тем же документом. Схематично список перехода можно представить следующим образом:
По сути, каждый пункт в списке переходов представляет собой ссылку на программу или файл. Так, например, мы можем запустить калькулятор или какой-либо документ заданного формата. К сожалению, у нас нет возможности напрямую перехватить событие нажатия на пункт в списке переходов. Каждый раз, когда мы выбираем очередной пункт будет запускаться новый экземпляр приложения. Это связано в первую очередь с тем, что список переходов можно вызвать даже тогда, когда приложение не запущено. В этом случае оно должно быть закреплено на панели задач. Например, на следующем рисунке видно, что Internet Explorer в данный момент не запущен, но список перехода мы открыть можем.
Итак, давайте посмотрим каким образом подобная функциональность может быть реализована в наших приложениях. Для работы со списками переходов нам понадобится объект типа JumpListManager, который входит в состав
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. Вызов этого метода необходим для обновления позиций в списке. Также обязательным действием является подписка на событие UserRemovedItems. Оно исполняется когда производится попытка удаления устаревших пунктов из списка переходов. Давайте теперь попробуем добавить новые позиции в список. Для этих целей существуют классы-обертки и методы у объекта JumpListManager.
Самый простой тип позиций в списке переходов - задачи. Задачей может быть запуск внешнего приложения или нашего приложения с какими-то параметрами. В WLM в виде задач реализовано переключение состояния пользователя. Для создания задачи в списке переходов используется метод 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, в который передается путь до приложения, заголовок и значок. Я добавил в свое приложение две задачи и получил следующий результат:
Другой вариант заполнения списка переходов - ссылки на документы, которые были загружены ранее. Для этих целей я создал несколько текстовых файлов с расширением ".myapp" и ассоциировал этот тип файлов со своим приложением. При запуске приложения я проверяю передано ли имя файла в качестве параметра при запуске приложения. Если имя задано, то я считываю этот файл и добавляю его в список ранее загруженных файлов. Для этих целей существует метод AddToRecent.
if (File.Exists(Environment.GetCommandLineArgs().Skip(1).FirstOrDefault() ?? String.Empty) == true)
{
_jumpListManager.AddToRecent(Environment.GetCommandLineArgs().Skip(1).FirstOrDefault() ?? String.Empty);
}
Теперь из Windows Explorer я открою эти файлы. При этом будет запускаться мое демонстрационное приложение (если мы правильно ассоциировали данный тип файлов с приложением). При этом при вызове списка я увижу, что в категории "Recent" появились ссылки на ранее открытые файлы.
Я могу закрепить те позиции, с которыми я работаю чаще всего. В этом случае я смогу быстро открывать нужные мне документы через список переходов.
Другой способ размещения позиций в списке - создание ссылок на постоянные документы/программы. В этом случае мы также можем сгруппировать эти позиции по категориям. Для этих целей существует метод 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
});
Я добавил несколько таких ссылок в список переходов и получил следующий результат.
На этом рисунке видно, что появились две дополнительные группы со ссылками внутри.
Замечательной особенностью списков переходов является то, что его содержимое также доступно в меню Start. Так, например, если мы активно пользуемся этой функциональностью, то это можно использоваться и из меню Start:
Таким образом мы можем использовать дополнительную функциональность, которую нам предоставляет панель задач Windows 7 для обеспечения максимально комфортной работы пользователя.
На этом я завершаю серию статей, посвященных программированию панели задач для Windows 7. Надеюсь эта информация окажется полезной для вас и ваших приложений. Хочу особенно отметить, что реализация возможностей панели задач Windows 7 для ваших приложений не потребует много усилий, но результат не заставит себя долго ждать - общаться с вашим приложением будет гораздо приятнее и удобнее.
Успехов вам в построении ваших приложений для Windows7!
Microsoft Most Valuable Professional, Microsoft Regional Director
июль 2009
Комментарии
По теме
- Видео-курсы от MS: Разработка приложений виртуальной и расширенной реальности на платформе Microsoft
- ECMA JavaScript 6: Объекты
- Как просто создать приложение для iPhone
- Разработка приложений под Windows Phone 8
- Индексированное хранилище, часть 2
- Индексированное хранилище, часть 1
- Начала Metro-программирования: создание настраиваемых приложений (ч.2)
- Начала Metro-программирования: создание настраиваемых приложений (ч.1)
- Начала Metro-программирования: создание компонентов WinRT (ч.3)
- Начала Metro-программирования: создание компонентов WinRT (ч.2)