2011-06-17 11 views
7

Tengo una aplicación de copia de seguridad que cerrará los programas en ejecución definidos por el usuario antes de la copia de seguridad para que los archivos de datos abiertos puedan cerrarse y enjuagarse antes de la copia de seguridad. Una vez completada la copia de seguridad, reinicia los programas en la lista.¿Una forma más amable que TerminateProcess?

No tengo ningún problema para obtener la ventana Manejar usando el Título y PostMensaje (AppHandle, WM_CLOSE, 0,0); Eso funciona bien para la mayoría de las aplicaciones, pero no para las que se ejecutan en el área de notificación (bandeja del sistema)

Actualmente estoy usando TerminateProcess (y funciona para esas aplicaciones del área de notificación, pero deja los archivos abiertos ya que Windows omite las instrucciones Cerrar y simplemente cierra de golpe esas aplicaciones abajo.

he buscado largo y duro y no puedo encontrar una manera más agradable para cerrar aplicaciones del área de notificación. puede alguien por favor ayuda?

Gracias

+3

'TerminateProcess' no deja archivos abiertos. Todos los identificadores abiertos se cierran cuando se cierra el proceso de propiedad. Además, si desea hacer una copia de seguridad de los archivos abiertos, el sistema operativo ya proporciona una API para eso: Shadow Copy. –

+0

@Rob: Intentar hacer una copia de seguridad de los archivos abiertos podría hacer que tome una instantánea mientras el archivo está en un estado incoherente. – Gabe

+1

@Gabe, no es peor que cerrar programas inesperadamente ... – bdonlan

Respuesta

8

con el fin de cerrar una programa con gracia, necesitas saber algo sobre cómo ese programa espera ser c perdido Si cerrar la ventana principal lo logra, entonces necesita saber cómo reconocer la ventana "principal".

Los programas no se ejecutan "en" el área de notificación. Muestran iconos allí. Cualquier programa con un icono de notificación también debe tener una ventana (porque el shell le dice al programa que se ha hecho clic en el ícono al enviar mensajes a la ventana). Incluso si la ventana no es visible, aún debe existir. Si puede determinar algún conjunto de propiedades que identifiquen la ventana asociada con un icono de notificación particular, entonces podría cerrarlo. Sin embargo, no hay un conjunto estándar de atributos que buscar; cada programa puede hacerlo de manera diferente.

E incluso si encuentra la ventana que está buscando, cerrarla podría no ser la forma en que el programa espera terminar. Puede esperar un cierto comando del menú del icono de notificación en su lugar, o algún mensaje enviado por un cuadro de diálogo que muestra el programa.

+1

+1. No tiene idea de qué hará que el programa realice sus operaciones de limpieza. Claro, puede enviar su ventana oculta a WM_QUIT o algo así, pero eso podría omitir toda la limpieza al igual que con TerminateProcess – bdonlan

+0

Me doy cuenta de eso, pero al menos usar wm_Close es mejor que cerrarlo con TerminateProcess. Un Cierre suave es más probable que cubra toda la limpieza necesaria.Si no, al menos mi aplicación intentó cerrar las cosas suavemente. Ver mi otro comentario a continuación. – user568160

2

Si su aplicación se ejecuta en Windows Vista o Windows 7, no apague los programas; en su lugar, use Volume Shadow Copy service para acceder a una instantánea de los archivos mientras todavía están en uso. Esto es lo que hace el programa de copia de seguridad integrado de Windows 7.

Si utiliza una versión anterior de Windows, no existe una solución infalible. Si el programa tiene un ícono de bandeja de sistema, también tendrá una ventana oculta, y puedes intentar enviarlo a WM_QUERYENDSESSION y WM_ENDSESSION. Sin embargo, no hay garantías de que el programa se cierre, y si se apaga, ya que puede estar pasando por alto partes de su proceso de apagado normal, es posible que no complete su limpieza normal. También puede haber programas en ejecución sin ventanas asociadas. El mejor enfoque sería simplemente cerrar la sesión del usuario y realizar la copia de seguridad desde un proceso de servicio. Por supuesto, todavía tendrá problemas para compartir archivos abiertos por otros servicios ...

+0

Gracias chicos, pero fue Shadow Copy el que primero me alertó sobre el problema. Con Shadow Copy, cualquier programa que descifre los archivos para uso exclusivo mientras se ejecuta y luego se cifra en Close se copia en el estado "Clear". ¡Todas mis contraseñas fueron copiadas y respaldadas en Clear! {jadeo} Es por eso que quiero cerrar amablemente y dejar que las aplicaciones pasen por su proceso Cerrar, que no funciona. – user568160

+2

Esos programas están rotos entonces; Eso es todo al respecto. Podría intentar omitir directorios temporales, pero si un programa de contraseñas descifra su base de datos de contraseñas y lo deja en el disco, ya está inutilizando el cifrado (¡un atacante podría escanear el disco en busca de archivos eliminados!) – bdonlan

Cuestiones relacionadas