¿Qué mensaje recibo cuando elimino 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 se envían WM_CLOSE y WM_QUERYENDSESSION porque no puedo verlo desde una aplicación C#. Si recibo uno de estos mensajes, quiero hacer una limpieza con mis archivos, pero el problema es que cuando lo elimino con TM, las funciones no funcionan. Parece que no me llegan 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);
}

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

preguntado el 22 de mayo de 12 a las 17:05

Solo obtiene WM_CLOSE cuando usa la pestaña Aplicaciones en el administrador de tareas. Matarlo desde la pestaña Procesos es una terminación grosera. No está muy claro cómo termina el mensaje en el código C++, la interfaz de usuario generalmente se realiza en C#. -

O obtendrás un CTRL_CLOSE_EVENT evento en aplicaciones de consola. Enlace obligatorio a la novedad relevante blog -

1 Respuestas

Su proceso no recibirá ningún mensaje en caso de que se elimine. Comienza en Terminar el proceso - ver mi destacado:

La función TerminateProcess se utiliza para hacer que un proceso salga incondicionalmente. El estado de los datos globales mantenidos por las bibliotecas de vínculos dinámicos (DLL) puede verse comprometido si se usa TerminateProcess en lugar de ExitProcess.

Esta función detiene la ejecución de todos los subprocesos dentro del proceso y solicita la cancelación de todas las E/S pendientes...

EDITAR: comentario de Hans Passant sobre la forma en que terminaron las tareas: solo obtiene WM_CLOSE cuando usa la pestaña Aplicaciones en el administrador de tareas. Matarlo desde la pestaña Procesos es una terminación grosera (TerminateProcess).

contestado el 22 de mayo de 12 a las 18:05

¿Y en caso de un apagado iniciado WM_QUERYENDSESSION? - Thanatos

si. Nota al margen sobre el administrador de tareas: creo que hay (¿hubo?) casos en los que el administrador de tareas intenta detener correctamente el proceso antes de finalizar, pero solo espero que TerminateProcess se use en el proceso si es importante para usted. - Alexéi Levenkov

Entonces, ¿conoce alguna forma de averiguar si el apagado se inició con c#? en winapi utilicé la sesión de consulta pero aquí? - Thanatos

Yo no. Es probable que no haya una llamada en Framework para hacerlo. PInvoke es siempre una opción (marque PInvoke.Net para la función que está buscando). - Alexéi Levenkov

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.