winapi process

winapi - Cómo terminar elegantemente un proceso?



process (5)

Quiero finalizar una serie de procesos, pero quiero dar a cada proceso la oportunidad de guardar sus datos, preguntarle al usuario acerca de cómo guardar un archivo e incluso ignorar la solicitud de cierre.

Así que TerminateProcess está descartado, porque mata el proceso al instante. Otra forma sería usar SendMessage / PostMessage para enviar un WM_CLOSE a la ventana principal, desafortunadamente no sé nada sobre las ventanas de los procesos, solo tengo el ID del proceso, por lo que FindWindow tampoco ayuda. ¿Hay alguna otra manera de encontrar las ventanas principales de un proceso?

En otras palabras: ¿hay alguna manera de finalizar cualquier proceso de forma elegante como lo hace el administrador de tareas cuando hace clic en " Finalizar tarea "? (y no "Finalizar proceso")


No estoy muy seguro acerca de las taskkill pero podrías ejecutar la función de línea de comandos taskkill .

taskkill /? taskkill /pid 1230 taskkill /im notepad.exe

El modificador / f obligaría a matar pero no lo usa, solo envía la señal de terminación para que la aplicación se cierre correctamente.


Para agregar a responda acerca de la terminación del proceso de la consola con gracia.

AttachConsole() para adjuntar a la aplicación de consola y enviar un evento de AttachConsole() control, similar a presionar CTRL + C en el símbolo del sistema.

Uso de GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, processID).

Este evento de control debe manejarse en la aplicación de la consola para la terminación graciosa.




EnumWindows enumera todas las ventanas de nivel superior en un proceso. GetWindowThreadProcessId obtiene el proceso y Id de cada hilo.

Ahora tiene suficiente información para cerrar con gracia cualquier aplicación GUI.

Puede enviar mensajes WM_CLOSE a cualquier ventana que desee cerrar. Muchas ventanas manejan WM_CLOSE para solicitar al usuario que guarde documentos. Puede enviar un mensaje PostThreadMessage usando PostThreadMessage a los hilos descubiertos para hacer que el ciclo de mensaje finalice.

El código de usuario no tiene permiso para llamar a DestroyWindow desde una aplicación diferente o al hilo de la ventana ... si la aplicación no responde a las solicitudes WM_CLOSE o WM_QUIT estás de regreso en TerminateProcess .

Esto no cerrará las aplicaciones de la consola ya que el proceso de la aplicación y el proceso que posee la ventana son diferentes.

No hay una manera real de cerrar las aplicaciones de la consola correctamente en Windows. Necesitan apoyar algún tipo de mecanismo cerrado elegante.