Розробка для панелі завдань Windows 7 – переходимо до списків переходів – частина 2, Windows, Операційні системи, статті

Друга частина статті про списки переходу з серії, присвяченій панелі завдань Windows 7. В попередній статті ми розповіли про елементи, які входять до складу списків переходів: призначення і задачах. Як розробник ви маєте значний рівень контролю над цими елементами. У цій статті ми поговоримо про різних API, які ви можете використовувати при програмуванні списків переходів.


Спочатку слід поговорити про одну важливу річ. Елементи, які потрапляють в категорію Recent (недавно відкритих), також як і в будь-яку іншу, повинні мати зареєстрований обробник файлів для програми в реєстрі. Це зовсім не означає, що додаток повинен бути стандартним обробником цього певного типу файлів. Це означає, що ваш додаток повинен мати зареєстрований обробник для всіх файлів, які ви хочете зробити доступними в спадному списку. Таким чином, елементами можуть бути тільки файли. Запам’ятайте, при клацанні по одному з елементів у спадному списку ОС виконує команду, асоційовану з цим файлом, по відношенню до вашої програми. Коли ви реєструєте обробник файлів, ви також вказуєте додаток, який обробляє файл, і визначаєте, як обробляти вхідні параметри. Ще одна важлива річ, яку необхідно пам’ятати: все елементи (файли) повинні бути локальними, тобто перебувати на локальному жорсткому диску, і бути доступними вашому додатком. Таким чином, ми можемо сказати, що кожен елемент в призначеннях списку є доступним локальним файлом із зареєстрованим обробником файлів.


Як ми згадували у попередніх статтях, як тільки ви зареєстрували обробник файлів, ОС фактично допомагає відслідковувати ці файли. У наступній статті ми поговоримо про обробнику файлів.


Крок 1. Використовуйте стандартну поведінку Windows “з коробки”


За замовчуванням списки переходів містять категорію “Recent”, яка у разі використовують файли додатків автоматично буде наповнюватися вмістом за допомогою функції SHAddToRecentDocs. Ця функція додає використаний елемент (файл) в список оболонки недавно використаних документів. На додаток до оновлення списку недавніх документів оболонка додає ярлик в налаштовувану папку з однойменною назвою. Панель завдань Windows 7 використовує цей список і папку недавніх документів для заповнення списку останніх документів в списку переходів.


Windows зможе виконати роботу за вас, якщо тип файлу вашого застосування зареєстрований в системі. Кожен раз, коли ви двічі клацаєте на файл із зареєстрованим обробником до того, як Windows запустить додаток, ОС автоматично викличе функцію SHAddToRecentDocs від імені вашого застосування. Це розмістить елемент в списку недавніх документів Windows, і, врешті-решт, в категорії “Recent” списку переходів. Те ж саме відбувається при використанні загального файлового діалогу (Common File Dialog, CFD) для відкриття файлів за допомогою типового додатку. Таким чином, це ще один хороший привід використовувати CFD, дебютував в Windows Vista і грає життєво важливу роль щодо бібліотек, як ми вже пояснювали в однієї зі статей циклу.


Обидва прикладу використовують стандартну поведінку Windows в тих випадках, коли у вас є зареєстрований обробник і Application ID, завдяки яким файли асоціюються зі списками недавно і часто використовуваних елементів. В обох випадках Windows автоматично вставляє елемент у список переходів, тільки якщо ви спеціально не відключили цю можливість, використовуючи COM API. Очевидно, що у користувачів також є можливість видалити будь-який елемент із списку переходів. Видаляючи елемент зі списку, ви переміщаєте його в список видалених елементів, який ми обговоримо нижче.


Крок 2. Створіть власну категорію


Якщо стандартні категорії не відповідають вашим потребам, то прийшов час створити власну категорію. Для цього необхідно використовувати інтерфейс ICustomDestinationList для створення власного списку.


ICustomDestinationList відкриває методи, які дозволяють додатком надавати власні списки переходів з власними призначеннями і завданнями для їх відображення в панелі завдань. Ось методи, які ми використовуємо для наведеного нижче прикладу:



Наступний приклад коду показує, як створити новий власний список під назвою Custom Lists і додати туди кілька елементів:


void CreateJumpList()
{
ICustomDestinationList *pcdl;
HRESULT hr = CoCreateInstance(
CLSID_DestinationList,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pcdl));
if (SUCCEEDED(hr))
{
//important to setup App Id for the Jump List
hr = pcdl->SetAppID(c_szAppID);
if (SUCCEEDED(hr))
{
UINT uMaxSlots;
IObjectArray *poaRemoved;
hr = pcdl->BeginList(
&uMaxSlots,
IID_PPV_ARGS(&poaRemoved));
if (SUCCEEDED(hr))
{
hr = _AddCategoryToList(pcdl, poaRemoved);
if (SUCCEEDED(hr))
{
pcdl->CommitList();
}
poaRemoved->Release();
}
}
}
}

Тут можна бачити, що ми почали зі стандартного виклику COM-ініціалізації. Ми викликали CoCreateInstance для ініціалізації об’єкта ICustomDestinationList (ось в чому полягає задоволення роботи з COM). Далі, ми вказали Application ID, щоб почати заповнювати список елементами.


Функція BeginList ініціювала початок сесії для користувача списку. Ця функція повертає максимальну кількість елементів, яке поміститься в зазначений список. Стандартне значення становить 10 елементів. Ви могли помітити параметр елемента Remove, IObjectArray * poaRemoved, який BeginList () повертає як вихідний параметр. Він зберігає будь-який елемент, вилучений користувачем зі списку переходів в ході поточної сесії.


Далі ми викликали допоміжну функцію _AddCategoryToList (), щоб провести всю фактичну роботу по додаванню елементів в налаштовувану категорію.


/ / Це функція помічника, що додає елементи в колекцію 
// object HRESULT _AddCategoryToList(ICustomDestinationList *pcdl,
// IObjectArray *poaRemoved)
{
IObjectCollection *poc;
HRESULT hr = CoCreateInstance
(CLSID_EnumerableObjectCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&poc));
if (SUCCEEDED(hr))
{
for (UINT i = 0; i < ARRAYSIZE(c_rgpszFiles); i++)
{
IShellItem *psi;
if (SUCCEEDED(SHCreateItemInKnownFolder(
FOLDERID_Documents,
KF_FLAG_DEFAULT,
c_rgpszFiles[i],
IID_PPV_ARGS(&psi)))
)
{
if(!_IsItemInArray(psi, poaRemoved))
{
poc->AddObject(psi);
}
psi->Release();
}
}
IObjectArray *poa;
hr = poc->QueryInterface(IID_PPV_ARGS(&poa));
if (SUCCEEDED(hr))
{
pcdl->AppendCategory(L”Custom category”, poa);
poa->Release();
}
poc->Release();
}
return hr;
}

Ще одним новим інтерфейсом, який ми використовували, є IObjectCollection, що представляє колекцію об’єктів з підтримкою функції IUnknown. У неї ми додали IShellItems. Кожен елемент (файл), який ми додали в список переходів, відноситься до типу IShellItem. У зазначених вище коді був створений об’єкт елемента оболонки для одного файлу, який існує у відомій папці – Documents. Однак перед тим, як ми фактично додали новий елемент у колекцію, ми повинні визначити, видалив його користувач. Якщо користувач точно видалив елемент зі списку, цей елемент буде в списку видалених елементів (І асоційоване з AppID) і, як розробники, ми повинні поважати бажання користувачів та уникати додавання цього елемента в список переходів. У нас вже є список віддалених елементів, IObjectArray * PoaRemoved, який був отриманий при виконанні функції BeginList (…) в момент ініціалізації нового списку.


На даному етапі у вас є колекція елементів оболонки, які користувач очікує побачити в списку переходів. Далі ми додамо цю колекцію в об’єкт ICustomDestinationList і створимо нову категорію під назвою “Custom category”, pcdl-> AppendCategory (L “Custom category”, poa);.


Отже, ми успішно створили нову категорію в панелі завдань під назвою “Custom category” і наповнили її чотирма елементами. Проте наша робота ще не закінчена. Фінальний крок функції CreateJumpList – викликати CommitList (), щоб закінчити транзакцію, розпочату з викликом BeginList (). Тільки після нашого дзвінка CommitList () в списку будуть відображатися нові елементи та категорії. Виклик CommitList () запускає очищення списку видалених елементів і створення нового списку видалених елементів. Інтерфейс ICustomDestinationList надає “транзакционную базу” API.


Щоб гарантувати зручність кінцевому користувачу, упевніться, що безпечна копія нового заповненого списку закінчена і готова до використання, і єдиною операцією, яку повинна виконати панель задач – переключити покажчик на новий список. Результат повинен виглядати наступним чином:




Використовуючи Windows API Code Pack, Ми можемо створити те ж саме додаток, використовуючи керований код.


Як тільки ми переконалися, що використовуємо той же AppID, що і всі елементи панелі задач, ми можемо створити примірник списку переходів для кнопки, над якою працюємо, як показано в наступному прикладі коду. Цей приклад є частиною CTOR основного вікна програми:


/ / Встановлюємо ID для програми
Taskbar.AppId = appId;
/ / Отримуємо список переходів
jumpList = Taskbar.JumpList;
category1 = new CustomCategory(“Custom Category 1”);
category2 = new CustomCategory(“Custom Category 2”);
/ / Додаємо власні категорії
jumpList.CustomCategories.Add(category1);
jumpList.CustomCategories.Add(category2);
/ / Значення за умовчанням для списків переходів
comboBoxKnownCategoryType.SelectedItem = “Recent”;

Тут ми вказали AppID, використовуючи властивість AppId, і створили примірник списку переходів, використовуючи статичну властивість Taskbar.JumpList. Ми також створили дві категорії під назвою Custom Category 1 і Custom Category 2. Потім ми додали ці категорії в контейнер для користувача категорій списків. І в кінці ми встановили категорію Known в Recent. Це автоматично заповнить список, як описувалося вище.


Після того, як ми налаштували користувача категорію, саме час наповнити її певним вмістом. Щоб зробити це, нам просто необхідно викликати функцію Add, щоб додати JumpListItem в JumpListCollection. JumpListItemCollection є спільною колекцією (належить ), що містить елементи IJumpListItem. За своєю суттю, елемент IJumpListItem є свого роду обгорткою для вбудованого IShellItem.


/ / Вказуємо шлях до об’єкта оболонки
string path = String.Format(“{0} est{1}.txt”,
executableFolder,
category1.JumpListItems.Count);
/ / Додаємо об’єкт в категорію
category1.JumpListItems.Add(new JumpListItem(path));

Спочатку нам треба вказати шлях до файлу, який ми хочемо включити в список переходу. Будь ласка, не забувайте, що ми можемо викликати функцію Add тільки, якщо файл розміщений на локальному диску і доступний користувачеві. Вищевказаний код (поряд з кількома іншими методами, про які ми розповімо в майбутніх статтях) стануть результатом діалогового вікна панелі завдань, яке буде виглядати наступним чином:




І, нарешті, нам треба викликати функцію Taskbar.JumpList.RefreshTaskbarList (). Так як у нас ми використовували вбудовану реалізацію списку переходів, ми повинні підтвердити зміни, внесені до списку. Більш пильний погляд на функцію Refresh (доступ до неї у вас є в Code Pack API) відкриває нам функцію AppendCustomCategories, яка додає будь-яку призначену для користувача категорію в користувальницький список переходів. У цій функції ви можете знайти керовані реалізації коду, наведеного вище. Також вона включає в себе виклик функції AppendCategory, яка є обгорткою для функції AppendCategory, показаної вище.


IObjectCollection categoryContent =
(IObjectCollection)new CEnumerableObjectCollection();
/ / Додаємо уявлення кожного посилання до масиву об’єктів
foreach (IJumpListItem link in category.JumpListItems)
categoryContent.AddObject(link.GetShellRepresentation());
/ / Додаємо поточну категорію до списку призначень
HRESULT hr = customDestinationList.AppendCategory(
category.Name,
(IObjectArray)categoryContent);

Як бачите, розібратися в можливостях панелі завдань в Windows 7 не так вже й складно. Windows автоматично зробить основну частину роботи, а якщо вам необхідно створити власну категорію, то зробити це дуже просто.


У наступній статті ми розповімо, як додати завдання в список переходів і зареєструвати обробник файлів.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*