Wewnątrz Windows 7: Wprowadzenie do interfejsów API paska zadań

Autorzy: Yochay Kiriaty i Sasha Goldshtein

Ten artykuł jest oparty na wstępnej wersji systemu Windows 7. Szczegóły mogą ulec zmianie.

 

Pasek zadań Windows 7 jest najnowszym wcieleniem w ciągu ewolucyjnych projektów pasków zadań, które zaczęły się od systemu Windows 1.0. Reprezentuje zmianę projektową w odniesieniu do interfejsu użytkownika i oferuje znaczną poprawę produktywności użytkowników.Rysunek 1 przedstawia pasek zadań z systemu Windows 1.0.(Warto zwrócić uwagę, że pasek zadań 1.0 bardziej przypomina pasek zadań Windows 7 niż pasek zadań Windows Vista.)

Rysunek 1: Pasek zadań z systemu Windows 1.0

Analiza wielu sesji użytkowników podczas ostatnich lat pokazała, że obfitość miejsc do uruchamiania programów niekoniecznie ułatwia pracę użytkownikowi.Jeśli chodzi o projekt interfejsu użytkownika, to w celu uniknięcia zamętu u użytkownika często lepiej jest mieć tylko jeden sposób wykonania danego zadania.

Celami projektowymi dla paska zadań Windows 7 jest przywrócenie kontroli użytkownikowi i zminimalizowanie zamieszania poprzez wsparcie dla następujących zasad:

  • Pojedynczy sposób uruchamiania często używanych programów i miejsc docelowych.Pomaga to utrzymywać pod ręką te aplikacje i dane, z których korzystamy cały czas.
  • Łatwość obsługi, gdzie przełączanie pomiędzy aplikacjami i oknami oraz organizowanie okien jest ułatwione i prostsze do ogarnięcia.
  • Czysty, prosty, pozbawiony chaosu.

Duże przyciski paska zadań, przejrzystość wizualna i elegancki wygląd dominują nad interfejsem użytkownika po zalogowaniu się w systemie Windows 7. Jak jednak programiści mogą wykorzystać tę nową funkcjonalność, którą ma do zaoferowania pasek zadań Windows 7?W jaki sposób wewnętrzne mechanizmy współpracują ze sobą pozwalając na lepszy interfejs użytkownika?W tym artykule zbadamy te nowe funkcje i wewnętrzną funkcjonalność paska zadań Windows 7 wsparte przykładami w kodzie zarządzanymi i niezarządzanym.

Przyciski paska zadań

Przyciski paska zadań zapewniają sposób dostępu do funkcjonalności nowego paska zadań Windows 7.Największą różnicą do zaobserwowania jest to, że pasek zadań zawiera również ikony dla aplikacji, które nie są aktualnie uruchomione.Na przykład użytkownik może przypinać aplikacje do paska zadań, w wyniku czego w pasku zadań pojawia się przypięta ikona, ale aplikacja nie jest uruchomiona.Kliknięcie tej ikony powoduje uruchomienie aplikacji.Jest to zunifikowanie obiektów paska Szybkie uruchamianie i standardowego paska zadań systemu Windows.W istocie nie ma już potrzeby istnienia obszaru Szybkie uruchamianie w systemie Windows 7; jedynym powodem, dla którego folder Szybkie uruchamianie nadal występuje w Windows 7 jest kompatybilność wsteczna.

Można też już było usłyszeć o listach skoków, paskach narzędzi miniatur, paskach postępu w pasku zadań i innych nowych funkcjach.Są one wszystkie połączone z dużymi, przeprojektowanymi przyciskami paska zadań, które zajmują miejsce w nowym pasku zadań.Przyciski paska zadań Windows 7, pokazane na Rysunku 2 są identyfikowane przez wiele efektów wizualnych.Można od razu zidentyfikować, które aplikacje działają, czy istnieje wiele okien otwartych w tej samej aplikacji, która aplikacja jest aktualnie aktywna i nad którym przyciskiem paska zadań aktualnie znajduje się wskaźnik myszy.

Rysunek 2: Różne stany przycisków paska zadań systemu Windows 7

Wszystkie funkcje paska zadań Windows 7 są odblokowane, jeśli tylko utworzymy przycisk paska zadań dla swojej aplikacji.Ma to sens, ponieważ nie możemy zmieniać na przykład ikony nakładkowej w pasku zadań, jeśli nie ma jeszcze przycisku paska zadań!W praktyce oznacza to, że aplikacje zarządzane i niezarządzane wykorzystujące nowe interfejsy API paska zadań Windows 7 będą musiały oczekiwać na nowy komunikat okna identyfikowany przez łańcuch TaskbarButtonCreated.Aby uzyskać identyfikator tego komunikatu, trzeba wywołać funkcję RegisterWindowMessage z interfejsu Win32 API i przekazać jej łańcuch TaskbarButtonCreated jako parametr.

Następujący kod pokazuje, w jaki sposób aplikacja Win32 uzyskuje komunikat okna wskazujący, że przycisk paska zadań został utworzony:

DWORD g_wmTBC = (DWORD)-1;

//W procedurze okna:
switch (msg) {
case WM_CREATE:
    g_wmTBC = RegisterWindowMessage(L"TaskbarButtonCreated");
    //Przejdź do utworzenia okna
case g_wmTBC:
    //Przycisk paska zadań został utworzony
}

Aplikacja zarządzana, na przykład aplikacja wykorzystująca Windows Forms, musiałaby przesłonić procedurę okna (metodę WndProc) formularza, aby przetwarzać komunikaty okna.Pokazuje to następujący kod:

uint wmTBC = (uint)-1;

[DllImport("user32.dll")]
static extern uint RegisterWindowMessage(string message);

void Form_Load() {
    wmTBC = RegisterWindowMessage(L"TaskbarButtonCreated");
}
protected override void WndProc(...) {
    if (msg == wmTBC) {
        //Przycisk paska zadań został utworzony
    }
}

Teraz wiemy, jak zapewnić, aby nasza aplikacja nie korzystała z paska zadań Windows 7, zanim przycisk paska zadań nie będzie na swoim miejscu.Zanim przejdziemy do bardziej interesujących funkcji, jest jeszcze jedna dodatkowa informacja, która będzie nam potrzebna do pełnego obrazu.W jaki sposób przyciski paska zadań są kojarzone z oknami i aplikacjami?Jak system decyduje, czy aplikacja potrzebuje dwóch przycisków paska zadań dla swoich różnych okien albo czy wiele aplikacji ma współdzielić pojedynczy przycisk paska zadań?

Odpowiedzią jest identyfikator aplikacji.Jest to nowa właściwość powłoki Windows i stanowi atrybut okien, procesów i łączy powłoki (znanych również jako skróty).Sterując identyfikatorami aplikacji dla poszczególnych okien i procesów programiści aplikacji mogą zapewniać, że przyciski paska zadań będą kojarzone z oknami tak, jak powinny.Identyfikator aplikacji jest łańcuchem znaków – a nie identyfikatorem GUID – który może mieć dowolny format i składać się z maksymalnie 128 znaków.Aby zapewnić, że identyfikatory aplikacji nie będą przypadkowo kolidować ze sobą, zaleca się, aby zawierać w nich nazwę firmy, nazwę produktu i nazwę aplikacji.Domyślny identyfikator aplikacji dla okna jest określany przez domyślny identyfikator aplikacji dla procesu, do którego należy dane okno.Ten z kolei jest domyślnym identyfikatorem aplikacji generowanym dla pliku wykonywalnego uruchamiającego ten proces.Spróbujmy uruchomić kilka razy aplikację taką jak Notatnik, aby zobaczyć to w działaniu.Tworzony jest tylko jeden przycisk paska zadań, nawet jeśli uruchomimy wiele wystąpień programu Notatnik w tym samym czasie.

Dostosowanie tych domyślnych identyfikatorów obejmuje jawne ustawianie identyfikatora aplikacji dla procesu lub dla pojedynczego okna, co stwarza interesujące scenariusze.Na przykład, jeśli ustawimy identyfikator aplikacji dwóch różnych procesów na tę samą wartość, to okna tworzone przez oba te procesy będą grupowane w tym samym przycisku paska zadań.Alternatywnie, jeśli ustawimy identyfikatory aplikacji dla dwóch osobnych okien (wewnątrz tego samego procesu) na różne wartości, to zostaną utworzone dwa przyciski paska zadań, po jednym dla każdego okna.Połączenie identyfikatora aplikacji dla procesu i identyfikatora aplikacji specyficznego dla okna daje maksimum elastyczności.Na Rysunku 3 lewa strona pokazuje, że okna z różnych procesów są wszystkie zgrupowane pod jednym przyciskiem paska zadań.Prawa strona pokazuje, że wiele okien z tego samego procesu ma różne przyciski na pasku zadań.

Rysunek 3: Okna, procesy i przyciski paska zadań

Ustawianie identyfikatora aplikacji dla procesu polega na wywołaniu funkcji Win32 SetCurrentProcessExplicitAppUserModelID z shell32.dll.Ustawienie identyfikatora aplikacji dla okna wymaga wywołania funkcji SHGetPropertyStoreForWindow, a następnie manipulacji na zwróconym obiekcie IPropertyStore.Następujący przykład pokazuje nam, jak to zrobić:

PROPVARIANT pv;
InitPropVariantFromString(L"MyAppID", &pv);

IPropertyStore* pps;
VERIFY(SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pps)));
VERIFY(pps->SetValue(PKEY_AppUserModel_ID, pv));
VERIFY(pps->Commit());

Jak na razie uniknęliśmy konieczności wywoływania skomplikowanych interfejsów API z kodu zarządzanego, ale teraz nie mamy wyboru.Na szczęście z pomocą przychodzi pakiet Windows API Code Pack.

Pakiet Windows API Code Pack for the Microsoft .NET Framework zapewnia bibliotekę, którą można wykorzystywać w celu uzyskiwania dostępu do nowych funkcji Windows 7 i Windows Vista z kodu zarządzanego.W momencie pisania tego tekstu, ten pakiet kodu zawierał obsługę bibliotek powłoki Windows 7, znanych folderów, okien zadań Windows Vista, list skoków Windows 7, ikon nakładkowych, pasków postępu i innych funkcji.Choć nie jest to produkt oficjalnie wspierany przez Microsoft, to ten pakiet kodu zapewnia bardzo dobre wprowadzenie dla programistów aplikacji zarządzanych dla systemu Windows 7. Pozwala uniknąć konieczności implementowania zarządzanych otoczek dla skomplikowanych funkcji Windows.

Pakiet Windows API Code Pack zapewnia statyczną właściwość Taskbar.AppId do manipulowania identyfikatorem aplikacji danego procesu.Niestety nie ma odpowiednika do ustawiania identyfikatora aplikacji dla konkretnego okna.Zamiast tego można to osiągnąć albo pisząc ręcznie wymaganą otoczkę, albo korzystając z wcześniejszego pakietu Windows API Code Pack(Przykładową bibliotekę interoperacyjną dla paska zadań Windows 7 można pobrać ze strony Windows 7 taskbar: Developer Resources.Korzystanie z tej biblioteki zapewnia nam statyczną metodę Windows7Taskbar.SetWindowAppId, która zajmuje się nieprzyjemnymi zadaniami interoperacyjnymi.)

Ikony nakładkowe i paski postępu

Droga do większości funkcji paska zadań Windows 7 wiedzie poprzez interfejs ITaskbarList3.Jeśli korzystamy z kodu zarządzanego i zarządzanych otoczek, to możemy nigdy nie natrafić na ten interfejs.Jeśli jednak korzystamy z kodu niezarządzanego, to ważne jest, aby wiedzieć, jak się do niego zabrać.Jest to proste, jeśli upewnimy się, że robimy to po tym, jak otrzymaliśmy komunikat wskazujący, że przycisk paska zadań został utworzony.Innymi słowy musimy poczekać na zainicjowanie przycisku paska zadań, a następnie uzyskać wskaźnik do interfejsu ITaskbarList3, jak w następującym kodzie:

ITaskbarList3* ptl;

VERIFY(CoCreateInstance(

  CLSID_TaskbarList, NULL, CLSCTX_ALL,

  IID_ITaskbarList3, (void**)&ptl));

Ustawienie ikony nakładkowej lub zapewnienie paska postępu w pasku zadań Windows 7 jest dość łatwym zadaniem.Na szczęście dla programistów kodu zarządzanego istnieje zarządzany odpowiednik w pakiecie Windows API Code Pack.Aby ustawić ikonę nakładkową, korzystamy z metody ITaskbarList3::SetOverlayIcon, która przyjmuje uchwyt ikony (HICON) i łańcuch znaków służący jako opis.Odpowiednikiem zarządzanym jest właściwość Taskbar.OverlayImage, która jest równie łatwa w użyciu.

Następujący kod określa ikonę nakładkową aplikacji w oparciu o wybór dokonany z listy rozwijanej (również pokazane na Rysunku 4):

void comboBox1_ValueChanged(...) {
    if (comboBox1.SelectedItem == ...) {
        Taskbar.OverlayImage = new OverlayImage(icon1, "Icon 1");
    } else {
        Taskbar.OverlayImage = new OverlayImage(icon2, "Icon 2");
    }
}

Rysunek 4: Program Windows Live Messenger i jego ikona nakładkowa

Podobnie metody ITaskbarList3::SetProgressState oraz ITaskbarList3::SetProgressValue modyfikują stan paska postępu w pasku zadań.Istnieje kilka stanów dostępnych do wykorzystania przez aplikacje:nieokreślony, wstrzymany, błędny i normalny.Wygląd poszczególnych stanów zestawiono na Rysunku 5. Odpowiednikami w kodzie zarządzanym są statyczne właściwości Taskbar.ProgressBar.State oraz Taskbar.ProgressBar.CurrentValue, jak również właściwość Taskbar.ProgressBar.MaxValue.

Rysunek 5: Różne stany paska postępu w pasku zadań

Poniższy kod i Rysunek 6 demonstrują, jak działanie w tle może wpływać na stan paska postępu w pasku zadań (zakładamy, że funkcja DoWork działa w osobnym wątku w tle):

HWND hmainwnd;//Główne okno aplikacj
ITaskbarList3* ptl;//Utworzone wcześniej

DWORD WINAPI DoWork(LPVOID) {
    ptl->SetProgressState(hmainwnd, TBPF_NORMAL);
    for (int i = 0; i < WorkToDo; ++i) {
        DoSomePartOfTheWork(i);
        ptl->SetProgressValue(hmainwnd, i, WorkToDo);
    }
    ptl->SetProgressState(hmainwnd, TBPF_PAUSED);
    return 0;
}

Rysunek 6: Internet Explorer raportuje postęp operacji pobierania.

Aplikacje, które wykorzystują wbudowaną funkcjonalność działań na plikach dodaną do powłoki Windows w systemie Windows Vista, automatycznie uzyskują obsługę paska postępu w pasku zadań za darmo.Jeśli korzystamy z funkcji Win32 SHFileOperation lub interfejsu IFileOperation, to nasz przycisk w pasku zadań będzie automatycznie pokazywał informacje o postępie działania na pliku, nawet jeśli wywołujemy interfejsy API z aplikacji konsolowej.Jeśli chodzi o kod zarządzany, to można przeczytać artykuł Stephena Touba w MSDN Magazine z grudnia 2007, zatytułowany „.NET Matters: IFileOperation in Windows Vista.”Jego klasa FileOperation zapewnia świetną otoczkę dla wewnętrznego, niezarządzanego interfejsu API i sprawia, że jest on równie łatwy w użyciu z poziomu kodu zarządzanego.Można wypróbować jego przykłady w Windows 7, a od razu zobaczymy demonstrację paska postępu w pasku zadań.

Paski narzędzi miniatur

Paski narzędzi miniatur są doskonałym dodatkiem do możliwości paska zadań w Windows 7.Funkcjonalność wyświetlania miniatur i podglądu na żywo została znacznie wzbogacona w Windows 7 (niestety dokładne ich omówienie nie mieści się w zakresie tego artykułu).Paski narzędzi miniatur zapewniają możliwość zdalnej mini-kontroli nad oknem z poziomu jego miniatury.Na przykład, aby przejść do następnej piosenki w programie Windows Media Player, nie musimy korzystać z niewygodnego paska programu Media Player, ani przełączać się na aplikację Media Player.Zamiast tego możemy skorzystać bezpośrednio z paska narzędzi miniatury, aby wykonać to zadanie bez przerywania swojej aktualnej pracy przeskakiwaniem do innej aplikacji, co pokazano na Rysunku 7.

Rysunek 7: Windows Media Player zapewnia pasek narzędzi miniatury do wygodnej nawigacji.

Aby skorzystać z paska narzędzi miniatury, musimy poczekać na zainicjowanie przycisku paska narzędzi, a następnie uzyskać wskaźnik do interfejsu ITaskbarList3, jak to opisano wcześniej.Następnie inicjujemy zestaw struktur THUMBBUTTON opisujących poszczególne przyciski, które pojawią się w tym pasku narzędzi (trzeba zwrócić uwagę, że jesteśmy ograniczeni do maksymalnie siedmiu przycisków i że nie ma sposobu na dodawanie lub usuwanie przycisków po zainicjowaniu paska narzędzi, a tylko na ich wyłączanie lub ukrywanie).Na koniec możemy wywoływać metody ITaskbarList3::ThumbBarAddButtons oraz ITaskbarList3::ThumbBarUpdateButtons, aby sterować paskiem narzędzi miniatury.

Gdy zostanie kliknięty przycisk w pasku narzędzi miniatury, aplikacja otrzyma komunikat WM_COMMAND z wyższym słowem wParam ustawionym na THBN_CLICKED, a niższym słowem ustawionym na identyfikator przycisku.Ten komunikat jest przekazywany do okna, do którego należy dana miniatura. Rysunek 8 demonstruje wymagane tworzenie i obsługę komunikatu.

Rysunek 8: Tworzenie i obsługa komunikatu

ITaskbarList3* ptl;//Utworzone wcześniej



//W naszej procedurze okna:

switch (msg) {

case g_wmTBC://TaskbarButtonCreated

    THUMBBUTTON buttons[2];

    buttons[0].dwMask = THB_ICON|THB_TOOLTIP|THB_FLAGS;

    buttons[0].iId = 0;

    buttons[0].hIcon = GetIconForButton(0);

    wcscpy(buttons[0].szTip, L"Tooltip 1");

    buttons[0].dwFlags = THBF_ENABLED;

    buttons[1].dwMask = THB_ICON|THB_TOOLTIP|THB_FLAGS;

    buttons[1].iId = 1;

    buttons[1].hIcon = GetIconForButton(1);

    wcscpy(buttons[0].szTip, L"Tooltip 2");

    buttons[1].dwFlags = THBF_ENABLED;

    VERIFY(ptl-&gt;ThumbBarAddButtons(hWnd, 2, buttons));

    break;



case WM_COMMAND:

    if (HIWORD(wParam) == THBN_CLICKED) {

        if (LOWORD(wParam) == 0)

            MessageBox(L"Button 0 clicked", ...);

        if (LOWORD(wParam) == 1)

            MessageBox(L"Button 1 clicked", ...);

    }

    break;

Odpowiednik dla kodu zarządzanego nie jest aktualnie dostępny w pakiecie Windows API Code Pack, ale ma się tam pojawić w przyszłej edycji.W międzyczasie możemy korzystać z biblioteki Windows 7 taskbar Interop Sample Library.Zawiera ona klasę ThumbButtonManager z odpowiednimi metodami CreateThumbButton i AddThumbButtons do sterowania paskiem narzędzi miniatury, a także klasę ThumbButton do modyfikowania stanu przycisku miniatury w czasie działania programu.Aby otrzymywać powiadomienia, rejestrujemy zdarzenie ThumbButton.Clicked i przesłaniamy procedurę okna, aby przekazywać komunikaty do klasy ThumbButtonManager, która zajmie się ich przetwarzaniem(więcej szczegółów można znaleźć w artykule „Windows 7 Taskbar: Thumbnail Toolbars”).

Listy skoków

Ostatnią funkcją paska zadań Windows 7, którą szczegółowo tutaj omówimy jest lista skoków, chyba najważniejsza funkcja, z której powinny korzystać aplikacje, aby naprawdę zabłysnąć w systemie Windows 7. W pasku zadań Windows 7 każdy przycisk paska zadań jest skojarzony z listą skoków.Jest to podręczne menu, które przedstawia kolekcję elementów (zwanych też miejscami docelowymi) i zadań, które są związane z daną aplikacją.Miejsca docelowe są zwykle reprezentowane przez elementy powłoki (poprzez interfejs IShellItem) i są plikami/dokumentami, z którymi pracuje nasza aplikacja.Zadania są zwykle reprezentowane przez łącza powłoki (znane też jako skróty, poprzez interfejs IShellLink) i mogą być używane do uruchamiania innych powiązanych aplikacji lub nawet naszej własnej aplikacji z innym zbiorem argumentów wiersza polecenia.

Niektóre aplikacje mogą dostosowywać obszar zadań listy skoków.Na przykład Windows Live Messenger wykorzystuje różne zadania i separatory, aby ułatwiać korzystanie z aplikacji z poziomu listy skoków, jak pokazano na Rysunku 9.

Rysunek 9: Windows Live Messenger

Niektóre inne aplikacje mogą preferować dostosowywanie obszaru elementów (lub miejsc docelowych) listy skoków, a nawet dzielić elementy na kategorie, aby praca użytkownika była wygodniejsza.Jako minimum aplikacje powinny zapewniać zbiór ostatnio lub często używanych elementów związanych z aplikacją, ponieważ użytkownicy będą coraz częściej oczekiwać tej funkcjonalności od każdej aplikacji w systemie Windows 7.Jako przykład rozważmy listę skoków programu Microsoft Office Word pokazaną na Rysunku 10. Chociaż Word nie był projektowany dla systemu Windows 7, to wykorzystuje infrastrukturę ostatnio używanych elementów wbudowaną w Windows i lista skoków działa w sposób domyślny.

Rysunek 10: Lista skoków z ostatnio używanymi dokumentami

Powinno być dość jasne, że możliwe jest zmuszenie listy skoków do działania bez znacznego wysiłku z naszej strony.Aby ostatnio używane elementy pojawiały się na liście skoków naszej aplikacji, należy wykonać następujące kroki:

  1. Upewnić się, że typ plików naszej aplikacji jest skojarzony z naszą aplikacją w rejestrze Windows (jako zarejestrowany program obsługi).Trzeba zwrócić uwagę, że nasza aplikacja nie musi być głównym lub domyślnym programem obsługi dla danego typu plików(więcej informacji można znaleźć pod adresem msdn.microsoft.com/en-us/library/dd378402(VS.85).aspx).
  2. Upewnić się, że korzystamy ze standardowych plikowych okien dialogowych do ładowania i zapisywania plików.Jeśli nie korzystamy ze standardowych plikowych okien dialogowych, powinniśmy informować powłokę Windows, kiedy korzystamy z pliku w efekcie żądania użytkownika wywołując funkcję Win 32 SHAddToRecentDocs(więcej informacji na temat standardowych okien dialogowym można znaleźć w artykule „Common Dialog Box Library” w MSDN).

Jeśli nasza lista skoków wymaga dalszego dostosowania, to możemy dodać niestandardowe kategorie miejsc docelowych lub niestandardowe zadania, aby wzbogacić jej funkcjonalność.Interfejs ICustomDestinationList jest źródłem funkcjonalności listy skoków razem z następującymi użytecznymi metodami:AddUserTasks, AppendCategory i AppendKnownCategory.Aby rozpocząć transakcję budowania listy, wywołujemy BeginList, a następnie możemy wybierać pomiędzy metodami AbortList i CommitList, które nie wymagają wyjaśnienia.Możemy również usunąć wszystkie elementy z listy wywołując DeleteList.Przykład transakcji budowania listy jest dostępny w zestawie Windows 7 SDK.

Ekwiwalent dla kodu zarządzanego jest znacznie łatwiejszy w użyciu.Wszystko zaczyna się od właściwości Taskbar.JumpList, która odblokowuje garść metod do manipulowania miejscami docelowymi i zadaniami listy skoków:metoda AddToRecent jest odpowiednikiem SHAddToRecentDocs, właściwość KnownCategoryToDisplay określa, czy domyślnie mają być pokazywane ostatnio lub często używane elementy, właściwość UserTasks zwraca modyfikowalną kolekcję zadań użytkownika, a właściwość CustomCategories zwraca kolekcję niestandardowych kategorii (Każda kategoria niestandardowa ma nazwę i zbiór elementów listy skoków).Poniższy przykład demonstruje dodawanie elementów i zadań do listy skoków aplikacji w transakcji budowania listy:

JumpListLink notpad = new JumpListLink {
    Title = "Launch Notepad", Path = @"C:\Windows\notepad.exe" };

JumpListItem doc1 = new JumpListItem(@"doc1.txt");
JumpListItem doc2 = new JumpListItem(@"doc2.txt");
CustomCategory category = new CustomCategory("Special Items");
category.JumpListItems.Add(doc1);
category.JumpListItems.Add(doc2);

Taskbar.JumpList.UserTasks.Add(notepad);
Taskbar.JumpList.CustomCategories.Add(category);

Warto zauważyć, że użytkownik może zdecydować o usunięciu elementów z paska zadań klikając je prawym przyciskiem myszy i wybierając „Usuń z tej listy”.Aplikacje muszą mieć świadomość tej funkcjonalności.Jeśli będą próbowały dodać element, który użytkownik usunął, to spowoduje niepowodzenie całej transakcji budowania listy.W kodzie Win32 przy wywoływaniu metody ICustomDestinationList::BeginList otrzymujemy kolekcję usuniętych elementów, które powinny wymagać dodatkowej uwagi, abyśmy nie dodali znowu tych elementów:

ICustomDestinationList* cdl;
VERIFY(CoCreateInstance(CLSID_DestinationList, ..., IID_ICustomDestinationList, (void**)cdl));

IObjectArray* removedItems;
cdl->BeginList(&maxSlots, IID_IObjectArray, (void**)removedItems);
//…Przejrzyj removedItems i podejmij decyzje
removedItems->Release();

Alternatywnie możemy proaktywnie wywołać metodę ICustomDestinationList::GetRemovedDestinations, aby uzyskać usunięte elementy zanim zainicjujemy transakcję budowania listy.Aplikacje zarządzane mogą korzystać z funkcjonalności wbudowanej w pakiet Windows API Code Pack i polegać na klasie JumpList, która automatycznie nie dodaje elementów, które były wcześniej usunięte przez użytkownika.Alternatywnie aplikacje zarządzane mogą zarejestrować obsługę zdarzenia Taskbar.JumpList.JumpListItemsRemoved, które występuje, gdy infrastruktura wykryje (wewnątrz transakcji budowania listy), że elementy zostały usunięte z listy skoków.

Podczas gdy różne alternatywy na liście skoków mogą wydawać się przytłaczające, trzeba mieć na uwadze, że większość użytkowników będzie oczekiwać od naszej aplikacji zapewnienia co najmniej najprostszego interfejsu – takiego jak lista ostatnio lub najczęściej używanych elementów, które były wykorzystywane w naszej aplikacji.Jeśli będziemy się stosować do tego fundamentalnego wymagania, to mamy niemal gwarancję satysfakcji użytkowników; jeśli dodamy niestandardową funkcjonalność do naszej listy skoków poprzez niestandardowe zadania i miejsca docelowe, to mamy możliwość wyróżnienia się w systemie Windows 7.

Rozmaite funkcje

Pasek zadań Windows 7 zawiera różnorodne inne funkcje, których nie omówiliśmy w tym artykule.Należą do nich: p odgląd na żywo (znany również podglądem Aero), dostosowywanie miniatur (może poprawić produktywność użytkowników przy podglądzie aplikacji), obsługę miniatur dla aplikacji wielodokumentowych (MDI – Multiple Document Interface) i z dokumentami na kartach (TDI – Tabbed Document Interface) oraz kilka innych.

Omówienie tych funkcji, jak również omówienie powiązanych interfejsów API i ich zarządzanych odpowiedników można znaleźć w następujących zasobach:

Podsumowanie

W tym artykule zbadaliśmy kilka funkcji paska zadań systemu Windows 7, takich jak identyfikatory aplikacji, paski narzędzi miniatur, ikony nakładkowe, paski postępu i listy skoków.Pasek zadań Windows 7 zapewnia czysty, elegancki system uruchamiania aplikacji, który przynosi duże korzyści użytkownikom.Integracja z tym systemem będzie głównym celem programisty aplikacji dla Windows 7.

Wykorzystanie interfejsów API Win 32 lub zarządzanego pakietu Windows API Code Pack daje nam możliwość wyróżnienia się i zabłyśnięcia naszych aplikacji w systemie Windows 7. Trzeba mieć na uwadze, że pasek zadań jest pierwszą rzeczą, którą widzą użytkownicy po zalogowaniu się w systemie Windows i chcielibyśmy, aby nasza aplikacja była przyczepiona do ich pasków zadań.

 

 

Yochay Kiriaty pracuje jako Technical Evangelist w firmie Microsoft skupiając się na Windows 7. Ma ponad dekadę doświadczenia w tworzeniu oprogramowania.Przygotowywał i prowadził akademickie kursy informatyczne i jest aktywnym współautorem The Windows Blog.

Sasha Goldshtein jest starszym konsultantem w Sela Group, międzynarodowej firmie szkoleniowej, konsultingowej i programistycznej.Sasha kieruje zespołem wydajności i debugowania w firmie Sela oraz specjalizuje się w zarządzanych i niezarządzanych rozwiązaniach dla Windows, w tym wysoko wydajnych aplikacjach, scenariuszach interoperacyjnych i wysoce dostępnych aplikacjach serwerowych.Jest autorem kursów na temat wewnętrznych funkcji Windows i Windows Vista, które były stosowane na całym świecie i znalazły miejsce w bibliotece kursów Microsoft.Sasha jest prelegentem na różnych konferencjach firmy Microsoft.