Quel message je reçois lorsque je tue mon programme avec le gestionnaire de tâches

J’ai donc une dll C ++, que j’utilise dans mon application c #, pour surveiller les messages Windows. Je veux savoir si WM_CLOSE et WM_QUERYENDSESSION sont envoyés car je ne peux pas le voir depuis une application C #. Si je reçois l’un de ces messages, je souhaite effectuer un nettoyage de mes fichiers, mais le problème est que lorsque je le tue avec TM, les fonctions ne fonctionnent pas. Il semble que je ne reçois pas les messages. Je pense que le problème est que le Gestionnaire des tâches envoie un message à l’application C # et non à la DLL c ++.

Un code:

c ++:

typedef void (*CLOSING_FUNCTION)(); CLOSING_FUNCTION myClosingFunction; typedef void (*SHUTDOWN_FUNCTION)(); SHUTDOWN_FUNCTION myShutdownFunction; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: return 0; case WM_CLOSE: myClosingFunction(); return 0; case WM_QUERYENDSESSION: myShutdownFunction(); return 1; case WM_DESTROY: myClosingFunction(); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } 

c #:

 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Close_Function(); private static Close_Function myCloseDelegate; [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Shutdown_Function(); private static Shutdown_Function myShutdownDelegate; static void StartMonotoring() { myCloseDelegate = Close; myShutdownDelegate = Shutdown; InterceptMessages(myCloseDelegate, myShutdownDelegate); } static void Close(); static void Shutdown(); 

Votre processus ne recevra aucun message au cas où il serait tué. Commencez sur TerminateProcess – voyez mon point culminant:

La fonction TerminateProcess est utilisée pour provoquer inconditionnellement la fermeture d’un processus. L’état des données globales gérées par les bibliothèques de liens dynamics (DLL) peut être compromis si TerminateProcess est utilisé plutôt que ExitProcess.

Cette fonction arrête l’exécution de tous les threads du processus et demande l’annulation de toutes les E / S en attente …

EDIT: Hans Passant commente la manière dont les tâches sont terminées – WM_CLOSE n’est utilisé que lorsque vous utilisez l’onglet Applications du gestionnaire de tâches. Le tuer depuis l’onglet Processus est une terminaison grossière (TerminateProcess).