Gibt es eine Möglichkeit zu garantieren, dass das Symbol in der Taskleiste entfernt wird?
Um das Taskleistensymbol hinzuzufügen, tun Sie Folgendes:
%Vor%Um das Taskleistensymbol zu entfernen, tun Sie:
%Vor%Was ich wissen möchte: Was passiert, wenn Ihre Anwendung abstürzt? Das Symbol bleibt so lange in der Taskleiste, bis Sie mit der Maus darüber fahren. Gibt es eine Möglichkeit zu garantieren, dass das Symbol entfernt wird, selbst wenn die Anwendung abstürzt? Ich würde es vorziehen, strukturierte Ausnahmebehandlung aus verschiedenen Gründen nicht zu verwenden.
Ein weiterer Fall, den ich behandeln möchte, ist, wenn der Prozess beendet wird, aber nicht unbedingt abstürzt.
Eine andere Sache, die die meisten Programmierer vergessen zu überprüfen ist, ob der Explorer neu startet / abstürzt. Es ist nett, wenn die Anwendung dies behandelt und ein eigenes Icon erstellt.
Suchen Sie einfach nach der Nachricht WM_TASKBARCREATED und erstellen Sie das Symbol neu.
Ich würde persönlich einen Vectored Exception Handler verwenden. Ja, es basiert auf SEH, aber Sie müssen sich nicht mit dem ganzen Stapel auseinandersetzen, den Sie brauchen, um sich zu entspannen.
TerminateProcess () muss mehr destruktiv sein. Sie können sich wirklich davor nicht schützen; wenn es passiert, ist dein Prozess tot. Es werden keine Anweisungen verarbeitet. Es spielt also keine Rolle, welcher Code in Ihrer Anwendung vorhanden ist.
Eine externe Anwendung würde nicht wirklich helfen, oder? Es könnte auch abstürzen oder getötet werden.
Sie können SetUnhandledExceptionFilter verwenden, um den Absturz zu erfassen. Ich benutze es normalerweise, um eine Crash-Dump-Datei zu erstellen, so dass der Absturz debuggt werden kann, aber es gibt keinen Grund, dass Sie nicht so einige einfache Bereinigung wie Entfernen von Taskleistensymbolen durchführen können.
Es gibt viele Möglichkeiten, den Aufruf von Shell_NotifyIcon(NIM_DELETE, &m_tnd);
in C ++ für den Fall des Crashing der Anwendung sicherzustellen. Die Verwendung eines RAII Wrappers über den von Ihnen verwendeten NOTIFYICONDATA
erledigt die Arbeit, zum Beispiel:
Dies ist eine vereinfachte Version des Wrappers, aber es zeigt die Hauptidee: Wenn Sie eine Instanz von NID
im statischen Speicher erstellen, wird sie vor dem Aufruf WinMain
oder main
und seinem Destruktor initialisiert die Bereinigung des Programms aufgerufen, auch wenn diese Bereinigung wegen einer abnormalen Beendigung erfolgt.
Also können wir diese NOTIFYICONDATA
Ressource, die in struct NID
verpackt ist, folgendermaßen verwenden:
Im obigen Beispiel wird ~NID()
aufgerufen, wenn das Programm beendet wird (nach einer Ausnahme oder nach dem Schließen des Programms), der Destruktor ruft Shell_NotifyIcon(NIM_DELETE, &icon_data);
auf und das Symbol wird aus dem Infobereich gelöscht; Dieser Code behandelt die normale Beendigung und die Beendigung der Ausnahme. Weitere Informationen zu diesem Thema finden Sie in dieser guten Antwort von NPE :
Was den Prozess Kill the process betrifft, gibt es dafür keine einfache Möglichkeit.
Ich habe das bereits getestet std::atexit
und std::at_quick_exit
Funktionen werden nicht aufgerufen, nachdem das Programm über den Task-Manager beendet wurde, also denke ich, dass Sie hook
Wenn ein Prozess beendet (nicht geschlossen) wird, kann nichts wirklich getan werden, es sei denn, Sie fangen an, etwas zu haken, entweder indem Sie
TerminateProcess
oderNtTerminateProcess
im Task-Manager-Prozess
Ich hoffe, es hilft (obwohl eine Antwort 6 Jahre später lol)
Adressiert nicht direkt Ihr Problem, aber das war eine sehr hilfreiche Arbeit für mich:
Ich wollte vermeiden, dass System-Tray-Zustände verwechselt werden. Für mich war es ausreichend, das Benachrichtigungsfeld beim Start zu "aktualisieren". Das war kniffliger als ich zuerst dachte, aber die folgende zeigt eine SendMessage-Lösung, die simuliert eine Benutzer-Maus-über-Säuberung, bei der es nicht erforderlich ist, den Cursor des Benutzers tatsächlich zu bewegen.
Beachten Sie, dass auf Computern mit Windows 7 der Name Notification Area
durch User Promoted Notification Area
ersetzt werden sollte.
Tags und Links c++ windows winapi system-tray