Así que tengo un dll 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 ver eso desde una aplicación 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 al C++ dll.Qué mensaje recibo cuando elimino mi programa con el administrador de tareas
Algunos 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();
Solo obtiene WM_CLOSE cuando usa la pestaña Aplicaciones en el administrador de tareas. Eliminarlo de la pestaña Procesos es una terminación grosera. No está claro cómo termina el mensaje en el código C++, la IU generalmente se realiza en C#. –
O obtendrá un evento 'CTRL_CLOSE_EVENT' en las aplicaciones de la consola. Obligatorio enlace a la vieja noticia relevante [blog] (http://blogs.msdn.com/b/oldnewthing/archive/2004/07/22/191123.aspx) –