Laden...

Application-Icon in der Taskleiste ändert sich nicht

Erstellt von WMenzel vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.592 Views
W
WMenzel Themenstarter:in
28 Beiträge seit 2012
vor 3 Jahren
Application-Icon in der Taskleiste ändert sich nicht

Hallo,
ich habe ein C'-Programm erstellt, mit dem ein Meßsystem abgefragt wird. Wenn die Verbindung zum Messgerät und die Hardware ok sind, wird die Anwendung minimiert ausgeführt. Wenn alle Messwerte i.O. sind, soll als Icon in der Taskleiste ein großer grüner Punkt, bei Fehlern ein roter Punkt erscheinen (sieht dann aus wie eine LED). Das funktioniert in der IDE beim Debug einwandfrei, auch wenn ich .EXE direkt vom Ort starte, wo sie abgelegt ist. Starte ich dagegen über eine Desktop-Verknüpfung, erscheint nur das Standardsymbol.
Wer kann da helfen?
Danke schon mal

Gruß
Wolfgang

4.931 Beiträge seit 2008
vor 3 Jahren

Wie zeigst du denn die Icons an (bzw. woher komme die, als Ressource oder aus einer Datei)?
Kann es sein, daß bei der Verknüpfung dann das aktuelle Arbeitsverzeichnis (working directory) nicht stimmt?

PS: Du meinst C#. 😉

W
WMenzel Themenstarter:in
28 Beiträge seit 2012
vor 3 Jahren
Icon in der Taskleiste

Hallo, ja ich meinte c# natürlich. Danke für die Korrektur.
Also ich wechsle das Icon mit "Icon = new Icon(StartPfad + "durchfluss_grünerpunkt.ico");
, wobei der Startpfad ist, wo die EXE liegt. Die Verknupfung auf dem Desktop greift doch auch auf diese Verzeichnis zu, so meine Überlegung. Leider gehts nicht.
Mit Ressource bin ich noch nicht so richtig klargekommen.

Gruß

5.657 Beiträge seit 2006
vor 3 Jahren

Woher kommt StartPfad? Wenn es nicht klappt, war offenbar deine Überlegung verkehrt. Verwende den Debugger, um herauszufinden, was nicht klappt: [Artikel] Debugger: Wie verwende ich den von Visual Studio?
Du kannst dir auch den Inhalt von StartPfad ausgeben lassen, dann weißt du, welcher Pfad verwendet wird, wenn du das Programm über einen Verknüpfung startest.

Und verwende immer Path.Combine, um Pfade zu kombinieren.

In deinem Anwendungsfall würde man aber die Icons aus den Resourcen auslesen, dann hast du solche Probleme gar nicht.

Weeks of programming can save you hours of planning

W
WMenzel Themenstarter:in
28 Beiträge seit 2012
vor 3 Jahren

Hallo, StartPfad lese ich so aus:

public static string GetApplicationsPath()
      {
         FileInfo fi = new FileInfo(Assembly.GetEntryAssembly().Location);
         return fi.DirectoryName;
      }

Ich habe leider noch nichts gefunden, wie ich die Dateien, wo die Icons drin sind, als Ressource einlesen kann. Gibt es da was verständliches? Das von Microsoft ist alles sehr kompliziert.

Gruß

16.806 Beiträge seit 2008
vor 3 Jahren

Das von Microsoft ist alles sehr kompliziert.

Eigentlich gilt die Microsoft Dokumentation sprachübergreifend als eine der verständlichsten Dokumentationen überhaupt (außer man verwendet die maschinell übersetzte statt das englische Original).

Ansonsten ist das einbetten von Ressourcen eine recht gut dokumentiertes Thema in der Internet Welt.
Mit Google-Suche nach c# icon as resource finde ich hunderte Treffer.

Mit Visual Studio geht das mit wenigen Klicks:

  • Projekteigenschaften
  • Tab Ressources
  • Icon einfügen

Sofort zugreifbar über <ProjectName>.Properties.Resources.<ResourceName>;

W
WMenzel Themenstarter:in
28 Beiträge seit 2012
vor 3 Jahren

Ich habe mir gerade mal den Pfad zum Icon angeschaut, also das stimmt alles. Eigenartigerweise geht es in der IDE aber nicht mit der Verknüpfung zur exe

16.806 Beiträge seit 2008
vor 3 Jahren

Es gibt unter Windows einen Unterschied zwischen Application Directory (in welchen Folder die Anwendung physikalisch liegt) und Working Directory (aus welchem Folder die Applikation ausgefüht wurde).
Oft sind diese nicht identisch; und wenn man das nicht beachtet, dann werden Pfade nicht gefunden.

Verwende gerade für Icons und Co einfach die Ressourcen.

Der Code Ausschnitt kann für Dein Problem nicht die maßgebliche Ursache sein.
Ps: Du kannst einfach schreiben: Path.GetDirectoryName() - dann sparst Du die zusätzlichen Zugriffe aufs Dateisystem, die FileInfo verursacht.

W
WMenzel Themenstarter:in
28 Beiträge seit 2012
vor 3 Jahren

Ich bin ja fast am verzweifeln.
So habe ich es jetzt gelöst, verwende die Ressources:

     private void IconTausch(string Farbe)
      {
         switch (Farbe)
         {
            case "gn":
               Icon = Properties.Resources.Durchfluss_gnPunkt;
               break;
            case "rt":
               Icon = Properties.Resources.Durchfluss_rtPunkt;
               break;
         }
      }

In der Form wird alles richtig angezeigt, aber in der Taskleiste bleibt nur das Standard-Icon stehen und läßt sich auch nicht ändern.
Irgendwas stimmt noch nicht.

4.931 Beiträge seit 2008
vor 3 Jahren

In deinem Code änderst du bisher nur das Form-Icon (ich gehe mal davon aus, daß die Methode in der Main-Form-Klasse steht).

Von welchem Icon sprichst du genau? Vom sog. Tray-Icon (unten rechts in der Taskleiste, links neben dem Datum) oder vom Icon auf dem Anwendungsbutton?

Ersteres wird über NotifyIcon.Icon gesetzt und letzteres entspricht dem Anwendungssymbol (Vorgehensweise: Angeben eines Anwendungssymbols ) und kann nachträglich nicht mehr geändert werden.

16.806 Beiträge seit 2008
vor 3 Jahren

Und mach doch bitte Deine Farbänderung nicht über strings...

public enum MyIconState
{
    Red,
    Green
}

private void IconTausch(MyIconState state)
      {
         switch (state)
         {
            case MyIconState.Green:
               Icon = Properties.Resources.Durchfluss_gnPunkt;
               break;
            case MyIconState.Red:
               Icon = Properties.Resources.Durchfluss_rtPunkt;
               break;
         }
      }


5.657 Beiträge seit 2006
vor 3 Jahren

In der Form wird alles richtig angezeigt, aber in der Taskleiste bleibt nur das Standard-Icon stehen

Ich glaube, jetzt verstehe ich dein Problem! Du änderst das Icon des Fensters, aber das Icon der Anwendung in der Taskleiste ändert sich nicht?

In der Taskleiste wird normalerweise das Icon der Anwendung angezeigt, aber das ist ein anderes, als das des Fensters. Und das Icon der Anwendung ist read-only.

Unter Windows 10 scheint es aber trotzdem zu funktionieren, da wird wohl das Fenster-Icon in der Taskbar angezeigt. Aber es wird anscheinend nicht aktualisiert, wenn man die Anwendung über eine Verknüpfung aufruft. Scheint irgendwas damit zu tun zu haben, daß Windows einen Chache für die Icons verwendet. Hier gibt es ein paar Infos dazu: Change icon displayed in taskbar at runtime

Für deine Zwecke (Benachrichtigungen, Status-Infos) würde man eher ein Icon in der TrayBar (rechts von der Taskleiste) anzeigen: How to: Add Application Icons to the TaskBar with the Windows Forms NotifyIcon Component

Weeks of programming can save you hours of planning

W
WMenzel Themenstarter:in
28 Beiträge seit 2012
vor 3 Jahren

Hallo, danke für die Hinweise, die ich natürlich alle gerne ausprobiere und befolge.
Ich habe jetzt eine Lösung gefunden. Wenn ich in den Takleisten-Einstellungen den Punkt "Schaltflächen der Taskleiste gruppieren" auf "Nie" stelle, dann funktioniert es. Es gibt auch einen entsprechenden Registry-Eintrag dazu, Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced/TaskbarGlomLevel auf 1 oder 2 setzen.
Natürlich werde ich das mit NotifyIcon noch testen.

Gruß
Wolfgane