Taskleistensymbol (also links unten in Taskleiste) nicht änderbar?

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    Taskleistensymbol (also links unten in Taskleiste) nicht änderbar?

    Neu

    Hi Ihr,

    ich stehe vor einem seltsamen Problem.

    Im Designer ist dem Mainform Icon das Icon "ProgrammSymbol_Grau" aus den Ressourcen meiner Anwendung zugewiesen (dieses zeigt ein ausgegrautes Programmsymbol).

    Im Mainform.load ordne ich mit me.icon = ProgrammSymbol_Grau erneut das "Disable"-Symbol aus den Ressourcen meiner Anwendung zu.
    Nachdem alle Programmteile initialisiert sind, weise ich mit me.icon = ProgrammSymbol_Normal dem Symbol das normale farbige Symbol aus meinen Ressourcen zu.

    Es passiert Folgendes:

    Im Debug-Modus:
    Das kleine Symbol in der Titelleiste und das Programmsymbol links unten in der Taskleiste werden entsprechend korrekt gesetzt und angezeigt.

    In der Release.exe:
    Das kleine Symbol in der Titelleiste meiner Anwendung übernimmt diese Zuweisungen korrekt, nicht aber das Programmsymbol links unten in der Taskleiste.
    Dieses zeigt seltsamerweise ab Programmstart das farbige Programmsymbol - wobei mir schleierhaft ist, woher an dieser Stelle die entsprechende Zuweisung stammt.

    Auch eingefügte Messageboxes nach den me.icon = xxx zeigen, dass bei Programmstart das graue Icon zugewiesen wird und erst nach Abschluss der gesamten Initialisierung das farbige Icon zugewiesen wird.

    Das Löschen des Icon-Caches mit:

    VB.NET-Quellcode

    1. ' Batch-Datei
    2. @echo off
    3. taskkill /f /IM explorer.exe
    4. CD /d %userprofile%\AppData\Local\Microsoft\Windows
    5. del /f /s /q Explorer\iconcache*.*
    6. del /f /s /q Explorer\thumbcache*.*
    7. Start explorer.exe


    bringt keine Änderung.

    Selbst das manuelle Neuzeichnen durch Aufruf von:

    VB.NET-Quellcode

    1. Public Sub UpdateTaskbarIcon(newIcon As Icon)
    2. Dim hwnd As IntPtr = MainForm.Handle
    3. If hwnd <> IntPtr.Zero Then
    4. ' Aktualisiere sowohl das kleine als auch das große Symbol
    5. SendMessage(hwnd, WM_SETICON, New IntPtr(0), newIcon.Handle) ' Kleines Symbol (Taskleiste)
    6. Threading.Thread.Sleep(100)
    7. SendMessage(hwnd, WM_SETICON, New IntPtr(1), newIcon.Handle) ' Großes Symbol (Alt+Tab)
    8. Else
    9. ' Log oder Fehlermeldung falls Handle ungültig ist
    10. MessageBox.Show("Fensterhandle ist ungültig!")
    11. End If
    12. MainForm.Invalidate()
    13. End Sub


    nach den beiden o.g. Icon-Zuweisungen bringt nicht den gewünschten Erfolg.

    Wie kommt das farbige Programmsymbol in meine Anwendung und wie bekomme ich die gewünschte Anzeige?

    Hat da jemand von Euch eine Idee?

    Beste Grüsse




    Ach herjeh...
    Das muss einem ja auch mal gesagt werden, dass Mainform.icon sich nur auf das kleine Symbol in der Titelleiste der Mainform bezieht und das in den Einstellungen - Anwendung gewählte Symbol sich auf das links unten in der Taskleiste befindende Symbol bezieht. :D

    Nur...
    die Preisfrage:
    Wenn ich in den Einstellungen - Anwendung das graue Symbol setze, startet mein Proggi im Release auch mit dem grauen Symbol.
    Nur... wie kann ich dieses Symbol ändern?
    Meine obigen Versuche mit der Funktion UpdateTaskbarIcon bringen keine Fehlermeldungen, aber das in den Einstellungen gesetzte Symbol ändert sich nicht.

    VB.NET-Quellcode

    1. Public Sub UpdateTaskbarIcon(Schalter As Integer)
    2. Dim newIcon As Icon
    3. If Schalter = 0 Then
    4. newIcon = MainForm.programmSymbol_Grau
    5. MainForm.GesamteOberflächeSperren = True
    6. Else
    7. newIcon = MainForm.programmSymbol_Normal
    8. MainForm.GesamteOberflächeSperren = False
    9. End If
    10. MainForm.Icon = newIcon
    11. Dim hwnd As IntPtr = MainForm.Handle
    12. If hwnd <> IntPtr.Zero Then
    13. SendMessage(hwnd, WM_SETICON, New IntPtr(0), newIcon.Handle) ' Kleines Symbol (Taskleiste)
    14. SendMessage(hwnd, WM_SETICON, New IntPtr(1), newIcon.Handle) ' Großes Symbol (Alt+Tab)
    15. End If
    16. If MainForm.icn_TaskleistenSymbol IsNot Nothing Then
    17. MainForm.icn_TaskleistenSymbol.Icon = newIcon
    18. End If
    19. MainForm.Invalidate()
    20. End Sub





    Aller Versuche schlagen fehl. ;(
    Aber es muss doch einen Weg geben - Inno-Setup z.b. kann doch auch das Taskleistensymbol zur Laufzeit in das ändern, welches im geöffneten Inno-Script gerade hinterlegt ist.

    VB.NET-Quellcode

    1. Public Sub EnableTaskbarIcon(Schalter As Boolean)
    2. Dim newIcon As Icon
    3. MainForm.GesamteOberflächeSperren = Not Schalter
    4. If Schalter = True Then
    5. newIcon = MainForm.programmSymbol_Normal
    6. Else
    7. newIcon = MainForm.programmSymbol_Grau
    8. End If
    9. MainForm.Icon = newIcon
    10. Dim hwnd As IntPtr = MainForm.Handle
    11. If hwnd <> IntPtr.Zero Then
    12. SendMessage(hwnd, WM_SETICON, New IntPtr(0), newIcon.Handle) ' Kleines Symbol (Titelleiste)
    13. ' Test Icon-Änderung - klappt nicht
    14. 'SendMessage(hwnd, WM_SETICON, New IntPtr(1), newIcon.Handle) ' Großes Symbol (Alt+Tab,Taskleiste)
    15. ' Test Cache durch leere Icons resetten - klappt nicht
    16. 'SendMessage(hwnd, WM_SETICON, CType(ICON_SMALL, IntPtr), IntPtr.Zero)
    17. 'SendMessage(hwnd, WM_SETICON, CType(ICON_BIG, IntPtr), IntPtr.Zero)
    18. 'Threading.Thread.Sleep(100)
    19. 'SendMessage(hwnd, WM_SETICON, CType(ICON_SMALL, IntPtr), newIcon.Handle)
    20. 'SendMessage(hwnd, WM_SETICON, CType(ICON_BIG, IntPtr), newIcon.Handle)
    21. ' Test Alternative Icon-Änderung - klappt nicht
    22. 'SetClassLong(hwnd, GCL_HICON, newIcon.Handle)
    23. End If
    24. If MainForm.icn_TaskleistenSymbol IsNot Nothing Then
    25. MainForm.icn_TaskleistenSymbol.Icon = newIcon
    26. End If
    27. 'MainForm.Invalidate() ' klappt nicht
    28. 'UpdateWindow(hwnd) 'klappt nicht
    29. 'RefreshTaskbar() 'klappt nicht
    30. End Sub
    31. Public Sub RefreshTaskbar()
    32. SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero)
    33. End Sub


    Beiträge zusammengefasst, bitte die [Bearbeiten] beim nächsten Mal nutzen ~VaporiZed

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

    Neu

    Ich hab nicht viel in meiner TestApp unter Win11, aber wenn ich in den Anwendungseinstellungen das Icon setze, dann wird dieses bei mir im TaskManager (1) angezeigt. Das Form-Icon kommt in der Titel-/Menüleiste (2) des entsprechenden Forms, in der Taskleiste (3) und bei Alt+Tab (4) für die App. Wenn ich mit

    VB.NET-Quellcode

    1. Me.Icon = New Icon(Dateipfad)
    das FormIcon neu setze, ändern sich die Symbole für (2), (3) und (4)
    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.

    Neu

    Hi @VaporiZed

    Danke Dir für Deine Hilfe. :)

    Ich habe es inzwischen mit Icons aus Direktpfad-Zuweisung und aus den Resourcen eingebundenen Icons versucht:

    VB.NET-Quellcode

    1. Public Sub EnableTaskbarIcon(Schalter As Boolean)
    2. Dim newIcon As Icon = Nothing
    3. Dim iconOnPfad As String = IO.Path.Combine(MainForm.ProgrammPfad, "ICE_On.ico")
    4. Dim iconOffPfad As String = IO.Path.Combine(MainForm.ProgrammPfad, "ICE_Off.ico")
    5. Dim iconOnResource As Icon = My.Resources.Zauberbuch25_Normal
    6. Dim iconOffResource As Icon = My.Resources.Zauberbuch25_Grau
    7. MainForm.GesamteOberflächeSperren = Not Schalter
    8. If Schalter = True Then
    9. If IO.File.Exists(iconOnPfad) = True Then
    10. newIcon = New Icon(iconOnPfad)
    11. End If
    12. ' newIcon = iconOnResource
    13. Else
    14. If IO.File.Exists(iconOffPfad) = True Then
    15. newIcon = New Icon(iconOffPfad)
    16. End If
    17. ' newIcon = iconOffResource
    18. End If
    19. If newIcon IsNot Nothing Then
    20. MainForm.Icon = newIcon
    21. Dim hwnd As IntPtr = MainForm.Handle
    22. If hwnd <> IntPtr.Zero Then
    23. SendMessage(hwnd, WM_SETICON, New IntPtr(0), newIcon.Handle) ' Kleines Symbol (Titelleiste)
    24. ' Test Icon-Änderung - klappt nicht
    25. SendMessage(hwnd, WM_SETICON, New IntPtr(1), newIcon.Handle) ' Großes Symbol (Alt+Tab,Taskleiste)
    26. ' Test Cache durch leere Icons resetten - klappt nicht
    27. 'SendMessage(hwnd, WM_SETICON, CType(ICON_SMALL, IntPtr), IntPtr.Zero)
    28. 'SendMessage(hwnd, WM_SETICON, CType(ICON_BIG, IntPtr), IntPtr.Zero)
    29. 'Threading.Thread.Sleep(100)
    30. 'SendMessage(hwnd, WM_SETICON, CType(ICON_SMALL, IntPtr), newIcon.Handle)
    31. 'SendMessage(hwnd, WM_SETICON, CType(ICON_BIG, IntPtr), newIcon.Handle)
    32. ' Test Alternative Icon-Änderung - klappt nicht
    33. 'SetClassLong(hwnd, GCL_HICON, newIcon.Handle)
    34. If MainForm.icn_TaskleistenSymbol IsNot Nothing Then
    35. MainForm.icn_TaskleistenSymbol.Icon = newIcon
    36. End If
    37. MainForm.Invalidate() ' klappt nicht
    38. UpdateWindow(hwnd) 'klappt nicht
    39. RefreshTaskbar() 'klappt nicht
    40. End If
    41. Else
    42. MessageBox.Show("Icon existiert nicht")
    43. End If
    44. End Sub


    Es klappt auch mit dem Symbol links in der Taskleiste wunderbar, wenn ich das Debug oder das Release aus deren Ordnern auf meinem NAS X:\ starte.

    Lasse ich aber das Release mit Inno-Setup nach C:\Programme\ installieren, funktioniert es nicht mehr.
    Dann wird nur noch das in den Eigenschaften - Anwendung hinterlegte Symbol links in der Taskleiste angezeigt.

    Das wahlweise anstelle des Anwendungs-Symbols links in der Taskleiste anzeigbare NotifyIcon meiner Anwendung im Infobereich der Taskleiste wird aber immer korrekt aktiv/Inaktiv angezeigt.

    Woran könnte das liegen?
    Ich hätte zu gerne eine Info für den User, wann meine Anwendung fertig geladen und initialisiert ist und er das Programm nutzen kann.

    Im Web finde ich einige Beiträge von Usern, die dieselben Probleme haben.

    Beste Grüsse

    Neu

    Also...
    ich vermute langsam, dass das Problem mit dem besonders geschützten Installationsordner C:\Programme zusammenhängt.
    Aber auch mit deaktivierer UAC wird das geänderte Programmsymbol nicht angezeigt.
    Das Problem besteht auch, wenn meine Anwendung als Admin mit erhöhten Rechten gestartet wird.
    Was könnte ich denn noch versuchen?
    Beste Grüsse

    Neu

    Dideldum schrieb:

    ich vermute langsam, dass
    Geh auf Nummer Sicher und installier es woanders, wenn möglich. Ich bin ja selbst nicht Fan von EigenAppInstallation. Ich kopier mir meinen Kram dorthin, wo es hinsoll und fertig.
    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.

    Neu

    Hi @VaporiZed
    eben das will ich eighentlich auch nicht machen, mein Programm direkt nach C: oder C:\MyApps installieren zu lassen.
    Schade, dass sich da irgendwas dagegen stemmt, im Windows, dass sich die Programmsymbole links in der Taskleiste nicht zur Laufzeit verändern lassen.
    Aber Andere App-Entwickler haben hierfür wohl einen Ausweg gefunden.
    Denn bei denen funktioniert es ja.

    Na, das stelle ich erst mal zurück.
    Denn mit dem "Bitte warten"-Fenster weiss der Anwender nun eh, dass er noch nicht werkeln kann.
    Vielleicht findet sich hier ja auch mal eine Lösung.
    Denn ich habe entdeckt, dass auch hier schon einige User über dieses Problem gestolpert sind und nachgefragt haben.

    Beste Grüsse