¿Qué mensaje recibo cuando finalizo mi programa con el administrador de tareas?

Así que tengo un dll de C ++, que estoy usando en mi aplicación c #, para monitorear los mensajes de Windows. Quiero saber si WM_CLOSE y WM_QUERYENDSESSION se envían porque no puedo ver eso desde una aplicación de C #. Si recibo uno de estos mensajes, quiero hacer algo de limpieza con mis archivos, pero el problema es que cuando lo mato con TM, las funciones no funcionan. Parece que no recibo los mensajes. Creo que el problema es que el Administrador de tareas envía un mensaje a la aplicación C # y no a la dll de c ++.

Algún código:

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);
}

do#:

[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();

Respuestas a la pregunta(1)

Su respuesta a la pregunta