Tray Icon bei event ändern

Hallo zusammen,

Ich habe in meiner MFC-Anwendung ein Tray Icon welches ich nach einem bestimmten Event ändern möchte. Das ganze funktioniert auch einigermaßen, aber leider bleibt das vorherige Icon immer im Tray stehen, zumindest so lange bis ich mit der Maus darüber fahre.

Zusammengefasst stellt sich die Frage wie kann ich das angezeigte Icon ändern? Oder. Wie kann ich das momentane Icon löschen und ein neues erstellen ohne, dass das alte Icon im Tray stehen bleibt.
Grüße
 
Das geht alles über die Shell_NotifyIcon-Routine, nur statt NIM_ADD benutze NIM_MODIFY, um ein vorhandenes Icon zu ändern. Shell_NotifyIcon identifiziert ein Icon anhand des HWND Handles und der ID, die du dem Icon gibst. Wenn du da dieselben Werte einträgst wie bei NIM_ADD, wird das vorherige geändert.
 
Erstmal, Danke für deine schnelle Antwort.

Leider habe ich nicht den blassesten schimmer von c++ und das ganz ist zudem noch mein erstes Projekt. Dieses NIM_MODIFY habe ich eher zufällig schon in den Definitionen des shellapi.h gefunden. Und das ganze funktioniert aber nicht. Ich vermute ich habe das Prinzip nicht verstanden.

Im groben geht es darum eine gewisse Anzahl von Prozessen in einen bestimmten Zeitintervall zu zählen und das Ergebnis im Tray anzuzeigen.
Code:
BOOL CMainFrame::TrayMessage(DWORD dwMessage){
ProzessCount proz;
int RESSOURCE = proz.GetProcessList("IEXPLORE.EXE"); // Hier ermittel ich welche Ressource gewählt werden soll
//int RESSOURCE = 130; //130 = icon0.ico; 131 = icon1.ico; 132 = icon2.ico 
CString sTip(_T("IEXPLORE.EXE")); 
NOTIFYICONDATA tnd;
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = m_hWnd;
tnd.uID = RESSOURCE;
tnd.uFlags = NIF_MESSAGE|NIF_ICON;
tnd.uCallbackMessage = MYWM_NOTIFYICON;
VERIFY( tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE RESSOURCE)) );
tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
lstrcpyn(tnd.szTip, (LPCTSTR)sTip, sizeof(tnd.szTip)/sizeof(tnd.szTip[0]) ); 
return Shell_NotifyIcon(dwMessage, &tnd);}

Der Aufruf müsste dann folgendermassen aussehen.

Code:
TrayMessage(NIM_MODIFY);

Dabei tut sich leider gar nichts. Nur über die Kombinaton von entfernen und dann wieder adden geht es. Ist aber leider unbefriedigend.

Grüße
 
Hi ...

Wenn ich das richtig verstanden habe ändert sich der Wert von 'RESSOURCE' bei jedem Aufruf.
Ich glaube aber, du müsstes auch die gleiche uID angeben, wenn du ein Icon verändern willst, d.h. du könntest die uID einfach statisch auf z.B. 1 setzen, dann könnte es funktionieren ...

Gruß
Shai
 
Wow Herzlichen Dank

Du errettest mich aus einen 13 Arbeitsstündigen Try&Error-Marathon einer schlaflosen Nacht und ziemlich nervigen Erklärungsnöten. Jetzt mach auch das ganze Verhalten Sinn, weil die uId immer mit geändert worden ist.
 
Zurück