Eine Möglichkeit sicherzustellen, dass ein Taskleistensymbol entfernt wird ... garantiert

8

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.

    
Brian R. Bondy 20.01.2009, 03:38
quelle

8 Antworten

4

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.

    
Stefan 20.01.2009 23:58
quelle
2

Sie könnten ein separates, einfacheres (und damit vermutlich robusteres) Programm haben, das Ihre Anwendung überwacht. Dieses Programm könnte Ihr Programm tatsächlich starten und dann den Prozess überwachen. Ja, das ist eine sehr hässliche Lösung.

    
Brian 20.01.2009 03:45
quelle
2

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.

    
MSalters 20.01.2009 09:29
quelle
1

Hmm, Sie können immer einen externen Monitor Prozess Anruf SendMessage mit der WM_PAINT Nachricht an das System Tray-Fenster haben (was Sie tun müssten, basierend auf der Klasse des Fensters). Das sollte das Symbol entfernen, das nicht mehr gültig ist.

    
casperOne 20.01.2009 03:46
quelle
0

Sie müssen mit dem Beenden der Anwendung fertig werden, wenn Sie auf die eine oder andere Art abstürzen oder das Symbol verschwindet nicht.

Sieh dir das an, wenn es eine Hilfe sein kann: Ссылка

    
Stefan 20.01.2009 03:47
quelle
0

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.

    
Ferruccio 20.01.2009 10:14
quelle
0

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:

%Vor%

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:

%Vor%

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 der Terminierungsaufruf ... es scheint eine ziemlich komplexe Aufgabe zu sein, wird aber in dieser Antwort von BSH :

  

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 oder NtTerminateProcess im Task-Manager-Prozess

Ich hoffe, es hilft (obwohl eine Antwort 6 Jahre später lol)

    
Paula_plus_plus 27.04.2015 14:06
quelle
-1

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.

    
phillipwei 24.11.2010 09:02
quelle

Tags und Links