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.
Use la función EndTask API. Es la misma función que usa el administrador de tareas.
BOOL EndTask(
HWND hWnd,
BOOL fShutDown,
BOOL fForce
);
http://msdn.microsoft.com/en-us/library/ms633492(VS.85).aspx
Vea MSKB Q178893 Cómo finalizar una aplicación "Cleanly" en Win32
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.