Erstellen von einfachen Deskbands

    • VB.NET
    • .NET (FX) 4.5–4.8

      Erstellen von einfachen Deskbands

      Vorabwarnung
      Es sind Änderungen in der Windows-Registry nötig! Wer da Mist baut, kann sich seine Windows-Installation zerschießen! Benutzung des Codes daher auf eigene Verantwortung und Gefahr!



      Was sind Deskbands? Kurz zusammengefasst: Deskbands sind in der Windows-10-Taskleiste auftauchende, kleine Infoleisten (mit ggf. großer Funktionalität), die vom Windows-Explorer gehostet werden und zu- und abgeschaltet werden können, indem man einen Rechtsklick auf die Taskleiste macht und bei Symbolleisten das gewünschte Deskband (de)aktiviert.

      hier mal zwei Beispiele:

      Ein einfacher, natürlich anklickbarer Button als Deskband


      Ein TableLayoutPanel mit zwei Labels, die Bestell- und Lieferzeiten für meine (nicht existenten) Lieblings-Pizzashops anzeigen.



      In diesem Tutorial erstellen wir Deskbands mithilfe einer externen Quelle, nämlich dem Projekt CsDeskbands, zu finden auf GitHub.

      Es gibt nun zwei Möglichkeiten, um es in ein neues VB-Projekt einzubinden (Modifizierungshinweis im Anschluss beachten!):
      1. Die verlinkte Projektmappe wird im Ganzen heruntergeladen, geöffnet und das darin enthaltene Projekt CSDeskband zu einer DLL kompiliert.
      2. Ihr erstellt ein neues C#-Klassenbibliotheksprojekt (.NET Framework), kopiert die Datei CsDeskband.cs (ich verlinke diese Datei nur, da ich nicht der Eigentümer bin) in das Projekt, macht in den Projekteigenschaften im Tab Build bei Symbole für bedingte Kompilierung den Eintrag DESKBAND_WINFORMS und kompiliert dieses Projekt, sodass Ihr eine DLL erhaltet.

      Modifizierungshinweis: In der Komplettdatei CsDeskband.cs gibt es (in Codezeile#758, Stand 17.05.2023) die Zeile internal sealed class CSDeskBandRegistrationAttribute : Attribute. Ändert sie in public sealed class CSDeskBandRegistrationAttribute : Attribute, damit dieses dort beschriebene Klassenattribut auch für andere Projekte zugänglich ist! Das brauchen wir später noch.

      Nachdem wir nun eine C#-Klassenbibliotheks-DLL haben, können wir nun ein neues VB.NET-Klassenbibliotheksprojekt erstellen, entweder in derselben oder in einer neuen Projektmappe. Dort fügen wir dem Projekt ein UserControl hinzu (es könnte auch ein anderes Control sein, aber mit einem UserControl haben wir mehr inhaltliche Gestaltungfreiheiten), gestalten es nach eigenem Ermessen und fügen die zuvor erstellte C#-DLL dem Projekt als Verweis hinzu.

      In der durch Visual Studio erstellten Datei Class1.vb (bitte zeitnah nach Ermessen sinnvoll umbenennen ;) ) fügen wir folgenden Code ein:

      VB.NET-Quellcode

      1. Imports System.Runtime.InteropServices
      2. Imports CSDeskBand
      3. <ComVisible(True), Guid("F00F00F0-F00F-F00F-F00F-F00F00F00F00"), CSDeskBandRegistration(Name:="MyOwnVbDeskband", ShowDeskBand:=True)>
      4. Public Class Deskband : Inherits CSDeskBandWin
      5. Private Shared _Control As Control
      6. Public Sub New()
      7. Options.MinHorizontalSize = New Size(100, 30) 'Minimalgröße in der Taskleiste
      8. _Control = New UcDeskband 'hier Name des UserControls angeben
      9. End Sub
      10. Protected Overrides ReadOnly Property Control As Control
      11. Get
      12. Return _Control
      13. End Get
      14. End Property
      15. End Class


      Was hat es jetzt damit auf sich, vor allem mit Zeile#4? Das Deskband muss in der Registry gemeldet werden, ansonsten nimmt Windows das Deskband nicht zur Kenntnis.
      Guid ist eine komplexe Zeichenkette, bestehend aus 5 hexadezimalen Zahlen. Ihr könnt Euch in einem eigenen Programm mit NewGuid eine erstellen lassen. Die von mir angegebene habe ich manuell erstellt. Funktioniert, ist aber nicht der vorgesehene Weg :) .
      Das Attribut CSDeskBandRegistration ist dank der o.g. Modifikation an der CsDeskband.cs nun verwendbar. Man kann nun den in der Symbolleistenübersicht anzuzeigenden Titel festlegen und man kann auch angeben, ob nach dem automatischen Registrierungsprozess, den ich gleich erkläre, das Deskband gleich angezeigt werden soll.

      Nachdem wir das UserControl gestaltet und GUID und Deskband-Titel angegeben haben, kompilieren wir das VB-Projekt zu einer DLL und müssen diese nun bei Windows in der Registrierung anmelden. Das geht mit zwei Möglichkeiten:
      1. Wie bei GitHub beschrieben, starten wir Visual Studio mit Adminrechten und wählen über das Menü Extras -> Befehlszeile -> Developer-Eingabeaufforderung. Dort geben wir den folgenden Befehl ein:

      Quellcode

      1. regasm /codebase
      und den Dateipfad unserer VB-DLL. Den Pfad können wir selber reinschreiben oder halbautomatisch erhalten: Wir aktivieren im Projektexplorer das Symbol [Alle Dateien anzeigen], klicken mit der rechten Maustaste auf unsere in VB erstellte DLL im Bin -> Debug-Ordner und wählen Vollständigen Pfad kopieren. Den Pfad können wir so dann in der Konsole einfügen, bei mir also

      Quellcode

      1. regasm /codebase D:\MyVbDeskband\MyVbDeskband\Bin\Debug\MyVbDeskband.dll
      Das bestätigen wir mit [Enter], fertig.
      Haben wir bei dem CSDeskBandRegistration-Attribut bei ShowDeskBand True angegeben, sollte jetzt ein blinkendes Symbol in der Taskleiste auftauchen, welches bei Anklicken fragt, ob die neue Symbolleiste aktiviert werden soll.

      2. Der manuelle Weg: Man sollte diesen Weg kennen, weil Weg 1 beim Rumprobieren und bei Projekterweiterungen immer mal wieder nicht zu machen scheint, was er soll.
      Wir erstellen in notepad eine neue Datei und schreiben hinein:

      Quellcode

      1. Windows Registry Editor Version 5.00
      2. [HKEY_CLASSES_ROOT\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}]
      3. @="MyVbDeskband"
      4. [HKEY_CLASSES_ROOT\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\Implemented Categories]
      5. [HKEY_CLASSES_ROOT\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\Implemented Categories\{00021492-0000-0000-c000-000000000046}]
      6. [HKEY_CLASSES_ROOT\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
      7. [HKEY_CLASSES_ROOT\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\InprocServer32]
      8. @="mscoree.dll"
      9. "ThreadingModel"="Apartment"
      10. "Class"="Deskband.Deskband"
      11. "Assembly"="MyVbDeskband.dll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
      12. "RuntimeVersion"="v4.0.30319"
      13. "CodeBase"="file:///D:/MyVbDeskband/MyVbDeskband/Bin/Debug/MyVbDeskband.dll"
      14. [HKEY_CLASSES_ROOT\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\InprocServer32\1.0.0.0]
      15. "Class"="Deskband.Deskband"
      16. "Assembly"="MyVbDeskband.dll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
      17. "RuntimeVersion"="v4.0.30319"
      18. "CodeBase"="file:///D:/MyVbDeskband/MyVbDeskband/Bin/Debug/MyVbDeskband.dll"
      19. [HKEY_CLASSES_ROOT\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\ProgId]
      20. @="Deskband.Deskband"
      21. [HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}]
      22. @="MyVbDeskband"
      23. [HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\Implemented Categories]
      24. [HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\Implemented Categories\{00021492-0000-0000-c000-000000000046}]
      25. [HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
      26. [HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\InprocServer32]
      27. @="mscoree.dll"
      28. "ThreadingModel"="Apartment"
      29. "Class"="Deskband.Deskband"
      30. "Assembly"="MyVbDeskband.dll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
      31. "RuntimeVersion"="v4.0.30319"
      32. "CodeBase"="file:///D:/MyVbDeskband/MyVbDeskband/Bin/Debug/MyVbDeskband.dll"
      33. [HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\InprocServer32\1.0.0.0]
      34. "Class"="Deskband.Deskband"
      35. "Assembly"="SupplierInfoDisplay, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
      36. "RuntimeVersion"="v4.0.30319"
      37. "CodeBase"="file:///D:/MyVbDeskband/MyVbDeskband/Bin/Debug/MyVbDeskband.dll"
      38. [HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{F00F00F0-F00F-F00F-F00F-F00F00F00F00}\ProgId]
      39. @="Deskband.Deskband"


      In vielen Zeilen muss die richtige Guid angegeben werden.
      In Zeile#4 und #30 kommt der anzuzeigende Titel des Deskbands hin.
      In Z#15, #21, #41 und #47 kommt Stammnamespace.Klassenname der VB-DLL rein. Wenn der Stammnamespace MyNamespace und der mit der GUID-Attribut markierten Klasse MyDeskband heißt, muss da also MyNamespace.MyDeskband stehen.* Wenn der nicht passt, wird beim Aktivieren des Deskbands nichts passieren.
      In Z#16, #22, #42 und #48 kommt der Assemblyname der VB-DLL rein*. Wenn der nicht passt, wird beim Aktivieren des Deskbands auch nichts passieren.
      In Z#18, #24, #44 und #50 kommt der Pfad der VB-DLL rein. Wenn der nicht passt, wird beim Aktivieren des Deskbands ebenfalls nichts passieren.
      Wir speichern diese Datei und benennen sie so um, dass der Dateiname nicht mit .txt, sondern mit .reg endet. Danach ein Doppelklick auf die Datei und bestätigen, dass die Werte der Registrierung hinzugefügt werden sollen.

      Nun starten wir den Windows-Explorer neu (entweder über den Task-Manager oder durch Benutzerneuanmeldung oder PC-Neustart) und können nun das Deskband aktivieren.

      Sobald das Deskband einmal dem Explorer bekannt ist, ist es latent bereit. Änderungen am VB-Projekt führen beim Kompilieren dann dazu, dass die DLL nicht überschrieben werden kann, weil sie durch Windows in Benutzung ist. Auch das kann umgangen werden, indem beim Kompilieren der Windows-Explorer über den Task-Manager neu gestartet wird.

      Das Entfernen aus der Registrierung geht wie die Anmeldung auf 2 Wegen:
      1. Wie bei der Anmeldung, nur mit

      Quellcode

      1. regasm /u
      und dem VB-DLL-Pfad (Guid muss die gleiche wie bei der Registrierung sein, also bitte nicht zwischendurch ändern)
      2. Man löscht die Registrierungsschlüssel, die man bei 2. selber angelegt hat.

      Das Deaktivieren und Reaktivieren des Deskbands startet die DLL neu. Werden also beim Erstellen des Deskbands besondere Prozesse durchlaufen, werden diese entsprechend bei Reaktivierung jener Symbolleiste diese ebenfalls wieder ausgeführt. Das ist z.B. relevant, wenn Daten aus anderen Quellen geladen werden sollen.

      * AssemblyName und Stammnamespace sind in den Projekteinstellungen zu finden:


      Die Version scheint keine Rolle zu spielen, sollte aber zur Sicherheit auch übereinstimmen.
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

      Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „VaporiZed“ ()