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

Це перша стаття в новому циклі, присвячених панелі завдань Windows 7. Розробникам варто приділяти панелі завдань першочергова увага. Ми повинні зрозуміти нові можливості панелі, щоб створювати додатки, ефективно працюють з нею, щоб розширити можливості користувачів і зробити їх роботу з ОС максимально зручною.


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

При першому запуску системи нова панель задач, мабуть, є найбільш помітним нововведенням в Windows 7. У Windows 7 панель задач являє собою механізм для запуску додатків і перемикання вікон, консолідуючим можливості панелей задач з попередніх версій Windows і, зокрема, панель швидкого запуску, недавні документи, повідомлення та вікна запущених додатків. На додаток до старих можливостям панель завдань Windows 7 володіє новими: списками швидкого переходу, інтерактивними слайдами відкритих вікон і т.п. Але для початку давайте закладемо основу для нашої бесіди і визначимося з термінологією.

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

 

 

Візьмемо, наприклад, кнопку Windows Media Player: вона не обрамлена і нічим не виділяється. Це свідчить про те, що Windows Media Player не запущений. Однак, додаток закріплено на панелі завдань і буде залишатися там, якщо ми не приберемо його. Навколо іконки Windows Explorer можна бачити тьмяну рамку: це свідчить про те, що додаток працює, але не активно. У Visual Studio іконка в більш непрозорою прямокутній рамці, що вказує на те, що в даний момент користувач працює з цим додатком. Зверніть увагу, що в Word відкрито багато документів і вони згруповані в одну іконку програми. Дуже важливо розуміти логіку створення та угруповання вікон додатків на панелі завдань.

Істотне кількість додатків, що працюють в Windows 7 (наприклад, Office Word 2007 і Visual Studio 2008), не були призначені для роботи з новою панеллю завдань Windows 7. Так яким же чином всі вони взаємодіють з панеллю задач і підтримують списки переходів в Word? В основі лежить спеціальний Application ID, який автоматично присвоюється запускаються програм після їх запуску. Кожне запускається додаток має свій AppID, що привласнюється або самої Windows, або додатком. Це не GUID, а простий строковий параметр, що складається максимум з 128 символів. Всі додатки і вікна, що мають однаковий параметр AppID, включаючи списки переходів, групуються в одну кнопку на панелі завдань. Важливо розуміти, що кожен компонент (процес, ярлик, вікно, кнопка або документ) має асоційоване з ним значення AppID.

Ви запитаєте, звідки береться цей AppID? Як уже згадувалося раніше, ОС генерує код для програми, використовуючи просту і важливу для розуміння евристику. Так як в Windwos 7 можна присвоювати AppID окремим вікнам, ОС намагається екстраполювати AppID додатки з його вікна. Програми, як правило, мають хоча б одне вікно, у якого система і запитує AppID. Однак, більшість програм не мають AppID, асоційованих з кожним вікном (або взагалі не мають AppID), тому система змушена звертатися до процесу, в якому виконується вікно. У кожного процесу є декілька властивостей, які може опитувати ОС, наприклад, виконуваний файл процесу. Але навіть у цьому випадку, процес не гарантує чіткого поділу. Різні ярлики можуть використовувати різні параметри для запуску одного і того ж виконуваного файлу і запускати абсолютно різні додатки (згадайте хоча б програми типу “launcher”), які згруповані під однією кнопкою на панелі завдань. У таких випадках ОС може досліджувати ярлик, відшукати виконуваний файл, параметри запуску і т.д. Зверніть увагу, у разі зареєстрованого типу файлу реєстрація вказує на додаток, що запускається подвійним клацанням на файлі. Це ще один спосіб отримання AppID. Нижчевикладене зображення ілюструє процедуру автоматичного отримання AppID:



 

Якщо вам цікаві внутрішні складові панелі завдань Windows 7, рекомендую вам подивитися кілька відео: відео Роба Джеретта (Rob Jarrett) і Бена Бетса (Ben Bets) – За лаштунками панелі завдань windows 7 і Огляд списків переходів.

Незважаючи на те, що ОС може автоматично привласнити AppID, багато розробників хочуть мати більший контроль над AppID для свого застосування чи окремого вікна. Припустимо, що у вас є додатки, запускають інші програми (таким чином працює налагодження за допомогою Visual Studio). Або у вас є кілька різних додатків і процесів, які ви хочете згрупувати під однією кнопкою панелі задач. У будь-якому випадку, якщо ви пишете новий додаток для Windows 7, ми настійно рекомендуємо задати свій власний ідентифікатор додатки, згідно з наведеною інструкції.

Тепер давайте перейдемо до безпосередніх тестам API, який дозволяє контролювати асоціації AppID для додатків.

Якщо необхідно задіяти окрему кнопку для кожного процесу (включаючи всі вікна, що належать цьому процесу), ви можете присвоїти AppID всьому процесу, в якому виконуються всі вікна додатка без окремих AppID. Присвоїти окремий AppID дуже просто: здійснюється це за допомогою функції SetCurrentProcessExplicitAppUserModelID:

 

SetCurrentProcessExplicitAppUserModelID(c_rgszAppID[0]);

де c_rgszAppID [0] – покажчик на рядок. Необхідно зазначити, що відповідно до документацією SDK цей метод має бути застосований в ході завантажити програму перед появою його інтерфейсу або маніпуляцій зі списками переходів.

В керованому коді з останньої версії API-бібліотек ви можете використовувати властивість AppID як частину об’єкта Taskbar, який можна знайти в просторі імен Microsoft.WindowsAPICodePack.Shell.Taskbar. Використовуючи цю властивість, можна привласнювати AppID.

Присвоїти AppID окремому вікна трохи складніше. Виконується це викликом функції SHGetPropertyStoreForWindow і подальшої маніпуляцією з об’єктом IPropertyStore для отримання необхідного властивості:

 

void SetAppID(HWND hWnd, int iAppID)
{
IPropertyStore *pps;
HRESULT hr = SHGetPropertyStoreForWindow(hWnd, IID_PPV_ARGS(&pps));
if (SUCCEEDED(hr))
{
PROPVARIANT pv;
if (iAppID >= 0)
{
hr = InitPropVariantFromString(c_rgszAppID[iAppID], &pv);
}
else
{
PropVariantInit(&pv);
}
if (SUCCEEDED(hr))
{
hr = pps->SetValue(PKEY_AppUserModel_ID, pv);
PropVariantClear(&pv);
}
pps->Release();
}
}

У наведеному фрагменті можна бачити, як витягуються властивість вікна викликом SHGetPropertyStoreForWindow, передачею hWnd в якості посилання на вікно. Потім ініціюємо за допомогою InitPropVariantFromString (c_rgszAppID [iAppID], & Pv) варіант властивості рядком, що представляє AppID для конкретного вікна. І, нарешті, встановлюємо значення нового властивості для вікна.

На жаль, нинішній Windows API Code Pack не підтримує установку AppID для окремих вікон, хоча все, що вам потрібно зробити, – це додати наступну функцію в файл Taskbar.cs:

 

private static void SetWindowAppId(string appId)
{
Microsoft.WindowsAPICodePack.Shell.ShellNativeMethods.SetWindowAppId
(OwnerHandle, “name here”);
}

Оскільки в Windows API Code Pack присутній вихідний код, ви можете подивитися на реалізацію функції SetWindowAppId і побачити на власні очі, що вона дуже схожа на приклад SetAppID, наведений вище. Зверніть увагу, що зовсім не обов’язково використовувати повне ім’я збірки “Microsoft.WindowsAPICodePack.Shell” – я використовував його, щоб пояснити ієрархію Windows API Code Pack.

До речі, ідентифікатор вікна AppID динамічний, так що цілком можливо щоб вікно відображалося як одна кнопка панелі завдань, а потім змінивши його AppID, змусити з’явитися на зовсім інший кнопці. Це має цікавий ефект. Припустимо, список переходу прикріплений до кнопки на панелі завдань (з конкретним AppID), тому одне і те ж вікно може відображати різні списки переходу при прикріпленні до інших кнопкам панелі завдань. Це може ввести користувачів в оману, тому ми рекомендуємо встановити вікна певний AppID і дотримуватися його, використовуючи той же процес для визначення AppID при кожному відображенні вікна.

Ви можете знайти керований код об’єкта Taskbar в проекті Windows API Code Pack.

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


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

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

Ваш отзыв

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

*

*