2012-02-28 16 views
7

Tengo este programa MFC que cuando lo mato con el administrador de tareas obtengo una excepción en mi programa y luego falla.¿Cómo el administrador de tareas mata mi programa?

Quiero obtener el evento del administrador de tareas, cuando va a matar mi proceso y cerrar mi programa correctamente.

Entiendo que hay pocos métodos que el administrador de tareas está utilizando para matar un proceso.

1) Desde la pestaña de aplicaciones, alguien me dijo que está enviando mensaje WM_CLOSE a la ventana visible principal de mi aplicación. Y si mi aplicación no se apaga después de unos segundos, el administrador de tareas detecta que no responde y utiliza TerminateProcess() en su proceso.

2) Desde la pestaña de proceso, alguien me dijo que está usando la API de Windows TerminateProcess().

¿Hay algún otro método que esté utilizando el Administrador de tareas?

¿Tengo razón sobre los 2 últimos métodos?

Gracias de antemano.

Respuesta

8

Sí, ambos son correctos. Debería responder a WM_CLOSE para cerrar con gracia. Esto podría venir de cualquier lugar, no solo del administrador de tareas (por ejemplo, apagado).

MFC normalmente maneja WM_CLOSE. Si su aplicación no responde, su tema principal debe estar saturado haciendo otra cosa, o más probablemente a partir de su descripción se cuelgue en algún lugar del controlador WM_CLOSE.

¿Puedes depurar tu aplicación para encontrar dónde se está produciendo la excepción?

+1

gracias, realmente no respondí al mensaje WM_CLOSE que fue enviado por el Administrador de tareas. He encontrado una implementación VACÍO de 'afx_msg void OnClose();' todo lo que tuve que hacer fue llamar a la implementación de la clase base de OnClose. – eladyanai

1

Cuando obtiene un WM_CLOSE, puede detectarlo fácilmente para que su aplicación pueda actuar sobre él.

No creo que sea posible saber cuándo se está llamando al TerminateProcess para matar su aplicación. La documentación TerminateProcess dice que es un cierre inmediato e incondicional del proceso objetivo.

(Dependiendo de la cantidad que desea lograr esto, echar un vistazo a this link sobre enganchar en la API de Windows, pero no esperes que sea fácil.)

+0

gracias por su respuesta, en realidad, no respondí a WM_CLOSE que fue enviado por el Administrador de tareas al matar mi proceso desde la pestaña Aplicaciones. eliminando mi proceso de la pestaña de proceso (por la función TerminateProcess) no hizo que mi aplicación se bloquee. – eladyanai

3

Sí, estas son las opciones.

Para mayor información, tenga en cuenta que las aplicaciones de modo de consola obtienen el envío CTRL_CLOSE_EVENT que podría reaccionar, cuando se hace clic en el botón "Finalizar tarea".

Tenga en cuenta que no puede interceptar ni reaccionar al TerminateProcess. Su proceso morirá y no hay nada que pueda hacer antes de que eso suceda. En realidad, sería pretty bad if you could. Porque entonces no habría forma de terminar un proceso que se descontroló.

+0

¡muy bueno para saber! muchas gracias, y estoy de acuerdo con la explicación de TerminateProcess. – eladyanai

1

Administrador de tareas utiliza internamente la función EndTask. Esta función envía un mensaje WM_CLOSE a su aplicación. Si su aplicación no responde a ese mensaje y el usuario obliga a terminar su Aplicación, se llama al TerminateProcess en su proceso.

Cuestiones relacionadas