Jumplist nutzen | Windows API Code Pack

    • C#
    • .NET (FX) 3.0–3.5

      Jumplist nutzen | Windows API Code Pack

      Hi,

      ich habe mich in letzter Zeit mal mit dem "Windows API Code Pack" befasst und mich nun einfach mal dazu entschieden, ein
      paar der enthaltenen Themen hier als Tutorial zu erstellen. Insofern meine anderen Tutorials zum Thema akzeptiert sind, werde
      ich sie hier verlinken. Im Tutorial werde ich C# verwenden, es gibt online allerdings Converter, sodass dieses Tutorial auch in
      Visual Basic nutzbar ist (oh Wunder). Nun aber los.

      1. Was ist das Windows API Code Pack?
      Das Windows API Code Pack (ich nenne es jetzt einfach mal "Code Pack") stellt neue Funktionen bereit, die Entwickler in ihre Programme einbinden können.
      Diese Funktionen sind nur im Code Pack enthalten und nicht im normalen .NET Framework zu finden. Der Download ist hier
      github.com/aybe/Windows-API-Code-Pack-1.1 (ehemals http://code.msdn.microsoft.com/WindowsAPICodePack)
      verfügbar und enthält auch Beispiele von Microsoft, ich werde die kompilierten und notwendigen Dateien aber in den Anhang packen :)

      2. Die Jumplist
      Die Jumplist ist das Menü, das beim Rechtsklick auf ein TaskbarIcon seit Windows 7 erscheint.

      Sie bleibt auch nach beenden des Programmes erhalten. Wichtig bei der Nutzung ist, dass die List nicht im
      Konstruktor bzw. Form-Load-Event gesetzt werden kann. Ich empfehle das Form-Shown-Event.

      3. Vorbereitung
      Los gehts!

      Zuerst setzen wir zwei Verweise, die wir benötigen, und zwar auf
      Microsoft.WindowsAPICodePack.dll und Microsoft.WindowsAPICodePack.Shell.dll.
      Danach importieren wir die nötigen Namespaces.

      C#-Quellcode

      1. using Microsoft.WindowsAPICodePack.Taskbar;
      2. using Microsoft.WindowsAPICodePack.Shell;


      Danach springen wir in die entsprechende Funktion und starten.
      Zuerst einmal deklarieren wir eine JumpList und löschen alle bisherigen UserTasks. Ein UserTask ist, wie der Name schon sagt, eine
      Aufgabe. Bei meinem Beispielbild existieren 2 UserTasks, "Sign Out" und "Quit Skype".

      C#-Quellcode

      1. JumpList jmpList = JumpList.CreateJumpList();
      2. jmpList.ClearAllUserTasks();


      4. Normale Tasks
      Zuerst erstellen wir mal einen normalen UserTask, somit eine Aufgabe. In diesem Fall werde ich eine Aufgabe erstellen, die
      eine neue Instanz der Anwendung öffnet. Hierzu erstellen wir einen JumpListLink und geben ihm einen Pfad und einen Namen.
      Auch ein Icon bekommt er, dieses wird per IconReference angegeben, da wir das Icon der Executable verwenden wollen.

      C#-Quellcode

      1. JumpListLink taskLink = new JumpListLink(Assembly.GetEntryAssembly().Location, "New Instance");
      2. taskLink.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 0);


      Anschließend fügen wir den erstellten JumpListLink der JumpList hinzu und refreshen selbe.

      C#-Quellcode

      1. jmpList.AddUserTasks(taskLink);
      2. jmpList.Refresh();


      Voila:


      Bei einem Klick auf "New Instance" sollte sich nun eine neue Instanz des Programms öffnen.
      Eine Besonderheit: Man kann auch Separators einfügen, meines Wissens nach aber nicht in den weiter unten behandelten Custom Lists.
      Um einen Separator in die normale Taskliste einzubinden, genügt es, einen Separator zu erstellen und per AddUserTasks einzubinden.

      C#-Quellcode

      1. JumpListTask separator = new JumpListSeparator();
      2. jmpList.AddUserTasks(separator);


      5. Erweiterte Tasks

      Ebenfalls gibt es erweiterte Tasks. Man hat die Möglichkeit, Listen mit eigenen Titeln zu erstellen, und den Links
      erweiterte Möglichkeiten zu bieten, wie zum Beispiel das direkte eingreifen ins Programm per WindowMessage oder co.
      Darauf werde ich im Folgenden eingehen.

      Zuerst mal Custom Lists:
      Eine Custom-List ist im Prinzip nichts anderes als die bereits oben genannte List "Aufgaben", nur mit eigenem Titel.
      Hier können dann JumpListLinks hinzugefügt werden. Hier werde ich jetzt einfach mal eine
      Custom List erstellen, die System-Programme beinhaltet.

      Zuerst deklarieren wir also die Custom List und geben ihr den Namen "System Utilitys".

      C#-Quellcode

      1. JumpListCustomCategory customCategory = new JumpListCustomCategory("System Utilitys");


      Danach deklarieren wir 2 JumpListLinks, ich habe hierfür Paint und den Rechner gewählt, und
      fügen diese unserer Custom List hinzu.

      C#-Quellcode

      1. JumpListLink calculator = new JumpListLink(Path.Combine(Environment.SystemDirectory, "calc.exe"), "Calculator");
      2. calculator.IconReference = new IconReference(Path.Combine(Environment.SystemDirectory, "calc.exe"), 0);
      3. JumpListLink paint = new JumpListLink(Path.Combine(Environment.SystemDirectory, "mspaint.exe"), "Paint");
      4. paint.IconReference = new IconReference(Path.Combine(Environment.SystemDirectory, "mspaint.exe"), 0);
      5. customCategory.AddJumpListItems(calculator, paint);


      Nun müssen wir diese Categorie nur noch unserer JumpList hinzufügen und danach logischerweise diese refreshen.

      C#-Quellcode

      1. jmpList.AddCustomCategories(customCategory);
      2. jmpList.Refresh();


      Erneut, Voila:


      6. Behandeln von Events

      Wie man die eigene Anwendung dazu bringt, ohne einen Neustart (also nicht per Arguments) auf einen Klick zu reagieren, werde ich
      in einer Antwort auf dieses Thema zeigen, sobald es freigeschaltet ist, andernfalls wäre dieser Post wohl zu overkill.
      Vermutlich werde ich dann ebenfalls genauer auf Dateien per JumpList eingehen, denn auch hier gibt es strenge Beschränkungen.

      Vielen Dank fürs lesen :)

      Grüße,
      Nikx
      Dateien
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()