Windows 10 Taskbar/Appbar addon

  • VB.NET
  • .NET 6

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Windows 10 Taskbar/Appbar addon

    Hallo ihr lieben,

    gibt es eine möglikchkeit solch anwendungen für die Windows Taskleiste zu programmieren?
    Oder reizt das die grenzen von Vb.net aus?
    liebe grüße,
    Daniel
    Bilder
    • 2022-11-07_211536.png

      13,56 kB, 382×41, 30 mal angesehen
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Das würde mich auch interessieren.
    Ich denke aber, dass das womöglich nur rahmenlose Fenster in der richtigen Position sind.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    N paar Minuten Internetsuche und ich kam bei stackoverflow und codeprojct raus.
    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.
    Die beiden Links sind auch nicht wirklich zufriedenstellend.
    Das eine ist eine externe Komponente und das andere sind Windows-Handles.
    Dann weiß ich wo was ist. Aber ob es eine Funktion gibt dort eigene "reservierte" Bereiche zu haben in denen man "arbeiten" kann, das wäre interessant.

    Ich hätte da was gefunden, aber keine Ahnung welchen Verweis ich da hinzufügen muss.


    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dive26“ ()

    Wenn Du uns schreiben/verlinken könntest, was Du gefunden hast, könnten wir vielleicht helfen …

    ##########

    Ich hätte was Simples im Sortiment:

    Nicht per Paint, sondern per VB.NET:

    VB.NET-Quellcode

    1. Private ReadOnly Graphics As Graphics = Graphics.FromHwnd(IntPtr.Zero)
    2. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    3. Dim TargetRectangle = New Rectangle(CInt(Screen.PrimaryScreen.WorkingArea.Width * 0.84), Screen.PrimaryScreen.WorkingArea.Height + 10, 100, 20)
    4. Graphics.DrawString("Hier ist mein Text", Me.Font, Brushes.White, TargetRectangle)
    5. End Sub
    6. Private Sub FrmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    7. Graphics.Dispose()
    8. End Sub
    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 1 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed

    Vielen Dank. Auf die "mit dem Zug drüberfahren"-Art wäre uns das eh klar.
    (auch wenn es hier schwierig wird, wenn die Taskbar verschoben (z.B. rechts oder links statt oben oder unten) oder in der Größe geändert oder man weis ja nie wie groß der Bereich rechts mit der Uhrzeit und den Windows-Symbolen ist.) Aber es wird hier so oft gepredigt keinen "bösen Code" zu verwenden, und dann kommt die Code-Keule ;-).

    Aber ob es da nicht eine richtige .NET Funktion oder Windows-Funktion dafür gibt - das wäre die Frage.
    Ich hab da was mit Taskleistenfunktionen in der Presentations.Foundation gefunden. Das geht aber leider nicht mit Winforms.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26: Dass man ein bisschen mehr dafür tun muss, ist mir bewusst. Aber vieles lässt sich auslesen/ermitteln, z.B. die Position und Größe der Taskleiste, sicherlich auch des TrayBereichs. Es war ein Ansatz. Denn das Bild in Post#1 lässt zumindest mich aufgrund der Darstellung vermuten, dass es ähnlich gemacht wurde. Wenn Du das als bösen Code ansiehst, dann ist es … Ansichtssache. Leider hast Du immer noch nichts zur Problemlösung beigetragen. Du schreibst, Du hättest was gefunden und man müsste dies und das verwenden und das ginge vielleicht nicht, aber konkret wirst Du immer noch nicht. Schade.

    Dem Stichwort von @BitBrösel folgend kommen wir wohl bei DeskBands raus.
    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.
    @BitBrösel

    ​Ich glaube das hier muss man dafür studieren:learn.microsoft.com/en-us/wind…/shell/taskbar-extensions

    Habe ich mir gestern angesehen und einiges (erfolglos) probiert. Dazu muss man WPF programmieren. In Winforms gehts anscheinend nicht.
    Ich habe mit etwas einfachem begonnen wir der Taskleisten-Progressbar - aber auch dass funktionierte nicht. Laut Google wohl nur mit WPF möglich.

    @VaporiZed
    Versteh mich bitte nicht falsch.
    Wenn man hier "bösen" VB6-Code postet wird man zur Strafe in die Ecke gestellt.
    Da ist doch das "böse" Zeichnen über fremde Bereiche noch viel schlimmer als ein wenig VB6-Code ;-).
    Das wollte ich damit ausdrücken.
    Und ja, das mit dem Timer und auf die Taskleiste zeichnen habe ich versucht - sieht leider alles andere als schön aus, weil die Taskleiste zu oft löscht und dann maximal ein Flackern rauskommt, egal wie hoch man den Timer stellt.

    Ich habe aber eine andere Möglichkeit in Aussicht, die ist zwar nicht genau das was sich @C.O.D.E vorgestellt hat, ist aber zumindest eine saubere Lösung, da nur "eigene" Bereiche modifiziert werden.
    Man nimmt einfach ein NotifyIcon und tauscht die Icon-Grafik regelmäßig aus (zeichnet die Werte einfach in die Grafik).
    Nachteil: man hat nur so viel Platz wie die Größe des Notify-Icons und mit Pech wird das Icon mit dem Pfeil nach oben in eine Gruppe zusammengefasst und ist somit erst nicht sichtbar.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Zwischen VB6-Code und malen-nach-Gutdünken sehe ich größere Unterschiede, aber wie gesagt: Ansichtssache.
    Das mit dem das-Icon-wird-unsichtbar kann man ja einstellen: Windows-Einstellungen -> Personalisierung -> Taskleiste -> Symbole für die Anzeige auf der Taskleiste auswählen; und dann die einschalten, die dauerhaft angezeigt werden sollen
    Bilder
    • TrayIconSettings.png

      36,48 kB, 717×527, 17 mal angesehen
    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.
    @VaporiZed
    Das mit dem Ausblenden und Einblenden wissen wir ja.
    Aber diese Aufgabe wieder dem User zu überlassen ist nicht die beste Lösung.
    Zudem: was macht man bei Windows 11? Da ist die Taskleiste in der Mitte - ganz böse ;-).

    Ich versuche mich heute mit einem transparenten Fenster auf der Taskleiste zu positionieren. Ist wohl die einfachste Lösung, wenn schon für MS nix dafür vorgesehen ist.
    Wenn es funktioniert, dann poste ich den Code hier.
    Das Notify-Icon ist auch etwas zu klein um dort eine vernünftige Ausgabe machen zu können.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Habe es mit einer transparenten Form nun so gelöst:



    Ein Timer aus der minimierten Hauptform ruft die Routine ShowInfosInTaskbar auf um die Anzeige zu aktualisieren.
    Die Hauptform macht die Form auch sichtbar oder unsichtbar - je nachdem ob die Hauptform sie minimiert oder normal ist.

    Die kleine Form auf der Taskbar ist Rahmenlso, Topmost=true, Hintergrund transparent.
    Die Größe der Taskbar-Form passt sich an den Inhalt an.
    Die Taskbar-Form kann mit der Maus verschoben werden und die Position wird dann so gespeichert.
    Der Timer in der Hauptform holt die Taskbar-Form in regelmäßigen Abständen nach vorne (weil die Tastkleiste auch Topmost=true ist).

    VB.NET-Quellcode

    1. Option Strict Off '(point to Size)
    2. Public Class FRM_Taskbar
    3. Dim ptMouseDownPos As Point
    4. Dim DockTop As Integer = 0
    5. Private Sub All_MouseDown(sender As Object, e As MouseEventArgs) Handles Label_PVMPPT.MouseDown, Label_PV_Label.MouseDown, Label_KWLabel.MouseDown, Me.MouseDown
    6. If e.Button = Windows.Forms.MouseButtons.Left Then
    7. ptMouseDownPos = e.Location
    8. End If
    9. End Sub
    10. Private Sub All_MouseMove(sender As Object, e As MouseEventArgs) Handles Label_PVMPPT.MouseMove, Label_PV_Label.MouseMove, Label_KWLabel.MouseMove, Me.MouseMove
    11. If e.Button = Windows.Forms.MouseButtons.Left Then
    12. Dim ptNewPos As Point = e.Location - ptMouseDownPos + Me.Location
    13. ptNewPos.Y = Screen.PrimaryScreen.WorkingArea.Height + 1 'Nur horizontal verschieben lassen - hier wird vorausgesetzt, dass die Taskbar unten ist
    14. Me.Location = ptNewPos
    15. My.Settings.TaskBarPos = ptNewPos.X
    16. End If
    17. End Sub
    18. Private Sub All_DoubleClick(sender As Object, e As EventArgs) Handles Label_PVMPPT.DoubleClick, Label_PV_Label.DoubleClick, Label_KWLabel.DoubleClick, Me.DoubleClick
    19. Form1.WindowState = FormWindowState.Normal
    20. Me.Close()
    21. End Sub
    22. ''' <summary>
    23. ''' Positioniert die transparente Form auf der Taskleiste.
    24. ''' Diese Funktion wird über einen Timer von der Hauptform aufgerufen, wenn diese minimiert wurde
    25. ''' </summary>
    26. Public Sub ShowInfosInTaskbar()
    27. If Me.Visible = False Then Exit Sub 'Falls die Form nicht angezeigt wird, diese Sub sofort wieder verlassen
    28. Dim XPosition As Integer = My.Settings.TaskBarPos 'X-Position der Anzeige
    29. 'Position der Taskbar ermitteln (Optional)
    30. '#########################################
    31. Dim TaskBarRectangle As Rectangle = Rectangle.Intersect(Screen.PrimaryScreen.WorkingArea, Screen.PrimaryScreen.Bounds)
    32. If TaskBarRectangle.Width = Screen.PrimaryScreen.Bounds.Width Then
    33. If TaskBarRectangle.Y <> 0 Then
    34. 'Taskbar ist oben angedockt - Ausgabefenster wird nicht unterstützt
    35. Me.Visible = False
    36. Exit Sub
    37. Else
    38. 'Taskbar ist unten angedockt, ist ok
    39. End If
    40. ElseIf TaskBarRectangle.Height = Screen.PrimaryScreen.Bounds.Height Then
    41. If TaskBarRectangle.X <> 0 Then
    42. 'Taskbar ist links angedockt - Ausgabefenster wird nicht unterstützt
    43. Me.Visible = False
    44. Exit Sub
    45. Else
    46. 'Taskbar ist rechts angedockt - Ausgabefenster wird nicht unterstützt
    47. Me.Visible = False
    48. Exit Sub
    49. End If
    50. Else
    51. 'Sollte eigentlich nicht vorkommen - Ausgabefenster wird nicht unterstützt
    52. Me.Visible = False
    53. Exit Sub
    54. End If
    55. 'Ab hier steht fest, dass die Taskbar oben oder unten liegt und die Maße sind in TaskBarRectangle
    56. '################################################################################################
    57. If XPosition = 0 Then XPosition = CInt(Screen.PrimaryScreen.WorkingArea.Width * 0.8)
    58. Me.Top = Screen.PrimaryScreen.WorkingArea.Height + 1
    59. Me.Height = Screen.PrimaryScreen.Bounds.Height - Screen.PrimaryScreen.WorkingArea.Height - 2
    60. Me.Left = XPosition
    61. 'Label mit Werten befüllen
    62. Me.Label_PV_Label.Text = My.Settings.PVPowerLabel
    63. Me.Label_PVMPPT.Text = FormatNumber(RealTime_mppt_power(0), 3)
    64. 'Label vertikal mittig zentrieren - abhängig von der Taskbar-Höhe
    65. Me.Label_PV_Label.Top = CInt((Me.Height - Me.Label_PV_Label.Height) / 2)
    66. 'Pos-Y der nachfolgenden Labels identisch mit dem ersten Label
    67. Me.Label_PVMPPT.Top = Me.Label_PV_Label.Top
    68. Me.Label_KWLabel.Top = Me.Label_PV_Label.Top
    69. 'Die Labels je nach Breite (Inhaltsabhängig) nacheinander anreihen
    70. Me.Label_PVMPPT.Left = Me.Label_PV_Label.Left + Me.Label_PV_Label.Width
    71. Me.Label_KWLabel.Left = Me.Label_PVMPPT.Left + Me.Label_PVMPPT.Width
    72. 'Das Fenster nur so breit wie alle Labels zusammen
    73. Me.Width = Me.Label_KWLabel.Left + Me.Label_KWLabel.Width + 2
    74. End Sub
    75. End Class
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    Dazu muss man WPF programmieren. In Winforms gehts anscheinend nicht.

    Sagen wir mal so. In WPF sind entsprechende Schnittstellen enthalten. In WinForms muss man halt direkt auf die COM-Interfaces zurückgreifen.
    Mfg -Franky-
    Hier noch eine kleine Ergänzung zum obigen Code.
    Da ich bemerkt habe, dass das ziehen der Form bei transparentem Hintergrund nicht möglich ist, habe ich die Transparenz wieder entfernt.
    Um aber die selbe Farbe wie die Taskleiste als Hintergrund zu haben, habe ich folgenden Code eingefügt:

    VB.NET-Quellcode

    1. 'Hintergrundfarbe ermitteln, da eine transparente Form nich mit der Maus gezogen werden kann
    2. Using b As New Bitmap(1, 1) 'Bild mit einem Pixel...
    3. Using g As Graphics = Graphics.FromImage(b)
    4. g.CopyFromScreen(XPosition - 2, Screen.PrimaryScreen.WorkingArea.Height + 4, 0, 0, New Size(1, 1))
    5. End Using
    6. Me.BackColor = b.GetPixel(0, 0)
    7. End Using


    Zudem ist die Form immer wieder kurz hinter der Taskleiste verschwunden, wenn man auf die Taskleiste klickte.
    Und wenn ich ​.bringtofront zu häufig hintereinander einsetze, dann kann ich in der _Form das Contextmenue nicht korrekt öffnen (weil es bei jedem .bringtofront wieder zugeht).
    Daher prüfe ich einfach ab ob die Form an oberster Stelle ist. Wenn nicht, dann hole ich diese einfach in den Vordergrund.
    Wenn doch, dann mache ich nichts und verhindere dadurch das Flackern:

    VB.NET-Quellcode

    1. Public Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As IntPtr
    2. Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer


    VB.NET-Quellcode

    1. If Me.WindowState = FormWindowState.Normal Then
    2. 'Falls die Anwendung über die normale Taskleistenfunktion normalisiert wird, die TaskleistenInfo ausblenden
    3. If FRM_Taskbar.Visible = True Then FRM_Taskbar.Visible = False
    4. Exit Sub
    5. End If
    6. Dim Caption As New System.Text.StringBuilder(256)
    7. GetWindowText(GetActiveWindow, Caption, Caption.Capacity)
    8. If Caption.ToString <> "FRM_Taskbar" Then FRM_Taskbar.BringToFront()
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at