c# - riesgos - procesos normales de windows 8
Qué mensaje recibo cuando elimino mi programa con el administrador de tareas (1)
Su proceso no recibirá ningún mensaje en caso de que lo maten. Comience en TerminateProcess - vea mi destaque:
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 utiliza TerminateProcess en lugar de ExitProcess.
Esta función detiene la ejecución de todos los hilos dentro del proceso y solicita la cancelación de todas las E / S pendientes ...
EDITAR: Hans Passant comenta las tareas de finalización: 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 (TerminateProcess).
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.
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();