Freitag, 1. April 2011

Windows 7 Features: Eine JumpList erstellen

Die JumpList bezeichnet unter Windows 7 das Kontextmenü einer Anwendung in der Taskleiste, welches durch Rechtsklick auf das Applikationssymbol sichtbar wird.
In diesem Menü befinden sich z.B. häufig geöffnete Dateien der Anwendung und mögliche Programmoptionen.
Für das C# Studio sieht meine JumpList beispielsweise so aus:


In C# können wir nun für unsere eigenen Anwendungen JumpLists erstellen und bearbeiten.
Obwohl es im Umfang des .Net Frameworks schon eine JumpList Klasse gibt, brauchen wir für Windows Forms Anwendungen doch das Windows API Code Pack, denn die vorhandene Klasse ist nur für WPF Anwendungen geeignet.
Die Installation des Windows API Code Packs habe ich hier beschrieben, die 2 entstandenen dll - Dateien müssen anschließend noch eingebunden werden (Projekt - Verweis hinzufügen - Durchsuchen). Die benötigten Dateien heißen "Microsoft.WindowsAPICodePack.dll" und "Microsoft.WindowsAPICodePack.Shell.dll", sie befinden sich im Installationsordner des Code Packs unter Shell\bin\Debug.
Die für diesen Post verwendete Klasse JumpList befindet sich schließlich in der Klasse Microsoft.WindowsAPICodePack.Taskbar.
In einer JumpList sind standardmäßig 2 Kategorien vorhanden: "Aufgaben" und "Häufig" (geöffnete Dateien).
Diesen Kategorien können wir durch die Funktionen AddUserTasks() bzw. AddToRecent() Einträge hinzufügen.
Als Einträge verwende ich in diesem Post Objekte der Klasse JumpListLink, welche einen Namen und ein Ziel erhalten, welches ein ausführbares Programm oder eine Datei sein kann.
Die Kategorie "Recent" lässt sich allerdings nicht so einfach befüllen, denn Windows lässt nur Dateien mit einer Endung zu, die für das entsprechende Programm registriert sind.
Mit einem kleinen Trick kann man sich allerdings die Schwierigkeit der Registrierung umgehen, es gibt nämlich die Möglichkeit, in den JumpLists eigene Kategorien anzulegen - legt man dann z.B. die Kategorie "Häufig" an, ist das Ergebnis das gleiche.
Der Beispielcode legt in der JumpList des Programms 2 Einträge unter "Aufgaben" an - einen Eintrag zu Paint und einen zum Windows Taschenrechner.
Für diese Programme werden ebenfalls Icons bereitgestellt, welche als IconReference direkt aus den Originalprogrammen referenziert werden.
Weiterhin legt der Code eine neue Kategorie an und erstellt in dieser einen Link zu einer Datei auf meinem Desktop.
Das anschließende Refresh() ist wichtig, damit die Änderungen übernommen werden.
Die JumpList des Programms ist auch beim nächsten Programmstart - sofern sie nicht gelöscht bzw. geändert wurde - noch in der gleichen Form erhalten!
Das Ergebnis sieht so aus:

Jetzt nun der Code, am Anfang ist ein
using Microsoft.WindowsAPICodePack.Taskbar;
erforderlich:

            JumpList CustomJumpList = JumpList.CreateJumpList(); // neue JumpListe erzeugen

            // Link zu Paint unter Aufgaben hinzufügen
            JumpListLink EntryPaint = new JumpListLink(@"C:\Windows\System32\mspaint.exe", "Paint");
            EntryPaint.IconReference = new Microsoft.WindowsAPICodePack.Shell.IconReference(@"C:\Windows\System32\mspaint.exe", 0);
            CustomJumpList.AddUserTasks(EntryPaint);

            // Link zum Taschenrechner unter Aufgaben hinzufügen
            JumpListLink EntryCalc = new JumpListLink(@"C:\Windows\System32\calc.exe", "Rechner");
            EntryCalc.IconReference = new Microsoft.WindowsAPICodePack.Shell.IconReference(@"C:\Windows\System32\calc.exe", 0);
            CustomJumpList.AddUserTasks(EntryCalc);

            // eigene Kategorie anlegen
            JumpListCustomCategory CustomCategory = new JumpListCustomCategory("Neue Kategorie");
            // in diese Link zu einer Datei anlegen
            CustomCategory.AddJumpListItems(new JumpListLink(@"C:\Users\User\Desktop\C#.txt", "C# Links"));
            CustomJumpList.AddCustomCategories(CustomCategory);

            // Änderungen übernehmen
            CustomJumpList.Refresh();