[DotNet] Détecter la fermeture d’une application Console

dotnet microsoft

Aujourd’hui un collègue m’a posé une colle: comment détecter et catcher la fermeture d’une application DotNet de type Console Application.

Pour une application WinForm ou WPF, pas de souci on a les application events mais malheureusement cela n’existe pas pour une application Console.

Mais heureusement il est possible de détecter la fermeture d’une application Console, qu’elle intervienne après un CTRL-C ou après un clic sur la croix de fermeture Windows.

Après quelques recherches sur Google, on a réussi à trouver une solution simple: utiliser les InteropServices et la dll système Kernel32.

Qu’est-ce qu’une Application Console

On appelle Application Console, une application simple, sans interface graphique, qui s’exécute dans une fenêtre type MSDOS.

ms-dos prompt

ms-dos prompt

Handle Console Application Exit

Voici un exemple de code qui illustre comment catcher la fermeture d’une application Console:

Imports System.Runtime.InteropServices
 
Module Module1
 
    <DllImport("Kernel32")> _
    Public Function SetConsoleCtrlHandler(ByVal Handler As HandlerRoutine, ByVal Add As Boolean) As Boolean
    End Function
 
    Public Delegate Function HandlerRoutine(ByVal CtrlType As CtrlTypes) As Boolean
 
    Public Enum CtrlTypes
        CTRL_C_EVENT = 0
        CTRL_BREAK_EVENT = 5
        CTRL_CLOSE_EVENT = 5
        CTRL_LOGOFF_EVENT = 5
        CTRL_SHUTDOWN_EVENT = 2
    End Enum
 
    'Fonction déclenchée lorsque l'application console est fermée (via la croix, ctrl-C, ...)
    Public Function ConsoleCtrlCheck(ByVal ctrlType As CtrlTypes) As Boolean
        'Faire votre code avant la fermeture du process ici
        Return True
    End Function
 
    Sub Main()
        Dim hr As New HandlerRoutine(AddressOf ConsoleCtrlCheck)
        GC.KeepAlive(hr)
        SetConsoleCtrlHandler(hr, True)
 
        'Fake code pour test
        While True
            Threading.Thread.Sleep(100)
        End While
    End Sub
End Module

Et voilà ! C’était pas compliqué 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *