Ein Weg, um sicherzustellen, dass ein system-tray-Symbol entfernt wird... garantiert
Gibt es einen Weg, um zu garantieren, dass Ihr system tray-icon wieder entfernt wird.
Hinzufügen, die system-tray-Symbol Sie:
Shell_NotifyIcon(NIM_ADD, &m_tnd);
Entfernen Sie die system-tray-Symbol Sie:
Shell_NotifyIcon(NIM_DELETE, &m_tnd);
Was ich wissen möchte: was ist, wenn Sie die Anwendung abstürzt? Das Symbol bleibt in der Taskleiste, bis Sie mit der Maus über. Gibt es eine Möglichkeit zu garantieren, dass das Symbol entfernt werden, auch wenn die Anwendung abstürzt? Würde ich lieber nicht verwenden, um die strukturierte Ausnahmebehandlung aus verschiedenen Gründen.
Einem anderen Fall, dass ich möchte, zu handhaben ist, wenn der Prozess getötet, aber nicht unbedingt Absturz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere Sache, die meisten Programmierer vergessen zu prüfen ist, wenn der explorer neustartet/abstürzt. Seine schön, wenn die Anwendung verarbeiten diese und erstellen Sie Ihr eigenes Symbol.
Einfach überprüfen für Nachrichten-WM_TASKBARCREATED, und erstellen Sie das Symbol.
Könnte eine separate, einfacher (und damit vermutlich robuster) ein Programm überwacht Ihre Anwendung. Dieses Programm könnte tatsächlich starten Sie das Programm und überwachen den Prozess. Ja, das ist eine sehr hässliche Lösung.
Persönlich würde ich eine Vektorielle Exception-Handler. Ja, es basiert auf SEH, aber Sie nicht haben, um mit all den verschiedenen Stacks, die Sie vielleicht brauchen, um zu entspannen.
TerminateProcess() ist, muss mehr destruktiv. Sie können nicht wirklich Schutz gegen, dass; wenn es geschieht, Ihr Prozess ist tot. Kein Erz-Anweisungen verarbeitet werden, so ist es egal, welchen code es ist in Ihrer Anwendung.
Einer externen Anwendung würde nicht wirklich helfen, würde es? Es zu Abstürzen, oder getötet zu werden.
Hmm, kann man immer einen externen monitor process call SendMessage mit der WM_PAINT-Nachricht an die system-tray-Fenster (das Sie würden tun müssen, basierend auf der Klasse des Fensters). Das sollte das Symbol entfernen, die nicht mehr gültig.
Sie haben, um die Anwendungen beenden beim Absturz der einen oder anderen Weise oder das icon wird nicht verschwinden.
Check this out, wenn es sein kann, jede Hilfe: http://www.codeproject.com/KB/shell/ashsystray.aspx
Können Sie SetUnhandledExceptionFilter zu fangen den Absturz. Ich normalerweise verwenden Sie zum erstellen eines crash-dump-Datei, so dass der Absturz debuggt werden kann, aber es gibt keinen Grund, Sie nicht so können einige einfache Aufräumarbeiten, wie das entfernen von Symbole in der Taskleiste.
Gibt es viele Möglichkeiten, um sicherzustellen, dass der Aufruf
Shell_NotifyIcon(NIM_DELETE, &m_tnd);
in C++ für den Fall der Anwendung crhashing; mit einem RAII wrapper über dieNOTIFYICONDATA
Sie verwenden, wird die Arbeit zu tun, zum Beispiel:Dies ist eine vereinfachte version des wrappers, aber es verdeutlicht die Grundidee: wenn Sie erstellen eine Instanz von
NID
im statischen Speicher wird initialisiert werden, bevor dieWinMain
odermain
Anruf und der Destruktor wird aufgerufen, das Programm cleanup, auch wenn diese Bereinigung ist aufgrund einer abnormalen Beendigung.So, wir können mit dieser
NOTIFYICONDATA
Ressource verpackt instruct NID
diese Weise:Dem obigen Beispiel ruft die
~NID()
wenn das Programm beendet wird (nach einer exception oder nach dem schließen des Programms), den Destruktor aufrufen wirdShell_NotifyIcon(NIM_DELETE, &icon_data);
und das Symbol wird gelöscht aus dem Infobereich; dieser code umfasst die normale Kündigung und die Ausnahme der Kündigung, Sie können mehr über dieses Thema in diese gute Antwort von NPE:Als für die kill den Prozess Fall gibt es keine einfache Möglichkeit, dies zu tun.
Hab ich schon getestet, die
std::atexit
undstd::at_quick_exit
Funktionen werden nicht aufgerufen nach der Tötung das Programm über den task-manager, so dass ich denke, dass müssen Sie Haken die Kündigung nennen... es scheint eine ziemlich komplexe Aufgabe, aber erklärt ist diese Antwort von BSH:Hoffe, es hilft (ist aber eine Antwort, die 6 Jahre später lol)
Nicht direkt auf dein problem, aber das war eine sehr hilfreiche Arbeit um für mich:
Wollte ich vermeiden verwirrende system-tray-Staaten. Also für mich war es ausreichend, um Sie "aktualisieren" Statusbereich der Taskleiste auf Start. Dies war schwieriger, als ich zunächst dachte, aber der folgende zeigt eine SendMessage-Lösung, die simuliert einen Benutzer, der-Maus-über-Bereinigung, die nicht die dass tatsächlich bewegt der Benutzer den cursor herum.
Beachten Sie, dass auf Windows-7-Rechner den Namen
Notification Area
sollte ersetzt werden, mitUser Promoted Notification Area
.