2011-02-09 8 views
5

necesitamos para nuestro proyecto escolar una forma de iniciar una instancia de palabra y rastrear si el documento fue cerrado. La API COM de Word Doens no tiene un evento para esto, ¿hay alguna otra forma de hacerlo?Inicie Word y supervise si el documento cerró

Actualmente estamos utilizando la API COM de palabra, pero todo lo demás estaría bien. Estamos programando en C#.

+0

¿Esto ayuda? http://stackoverflow.com/questions/4329521/how-to-handle-word-close-event-from-winforms-application – Koen

+1

También probamos esto, pero notamos que si ya existía un procesador de palabras, nuestro nuevo proceso se fusionaba en el funcionamiento. También organizamos una vista previa, por lo que siempre hay un proceso de palabras. – MBulli

Respuesta

2

Si su uso de la biblioteca Microsoft.Office.Interop.Word hay un evento que puede suscribirse también:

Microsoft.Office.Interop.Word.Application wordApp = 
    new Microsoft.Office.Interop.Word.Application(); 
wordApp.DocumentBeforeClose += 
    new ApplicationEvents4_DocumentBeforeCloseEventHandler(
     wordApp_DocumentBeforeClose); 

...

private void wordApp_DocumentBeforeClose(Document Doc, ref bool Cancel) 
{ 
    // Do your thing 
} 

Editar:

Para cuidar el bloqueo de archivos ==> eche un vistazo a this post. Como puede ver, se hacen algunas cosas en el documento antes de cerrar:

  1. Compruebe si el documento está guardado. Si no es así, pregunte dónde guardarlo y hágalo usted mismo.
  2. cerrar el documento mismo
  3. Cierre Word

Después de estas cosas son atendidos, puede hacer sus cosas. La cerradura debería ser liberada.

+0

Pero necesitamos un evento para AfterClosed, lo hicimos para BeforeSaved con un async while loop checkin doc.Saved == true pero no encontramos nada como eso para BeforeClose – MBulli

+0

Y qué es lo que necesita hacer una vez que sepa que el documento ¿está cerrado? – Koen

+0

Lea todos los bytes del documento y póngalo en un archivo db. El problema es que la palabra tiene un bloqueo de archivo, mientras está abierto. – MBulli

2

Utilice el proceso winword para comprobar si el proceso que se ejecuta en el archivo de particualo se ha cerrado o no.

Si no conoce el proceso de la instancia recién iniciada, use esto o simplemente enganche el evento exit del proceso.

obtener toda palabra procesa

var info = Process.GetProcessesByName("winword").FirstOrDefault(); 

Identificar el proceso de archivo en particular usando evento salido Process.MainWindowTitle

gancho del proceso Process.Exited

+0

Está bien, esto debería funcionar, pero ¿y si el usuario crea un nuevo documento en Word? – MBulli

+0

no importa quién creó el proceso. Siempre obtendrá el proceso utilizando GetProcessByName. Si desea monitorear cualquier instancia específica de palabra, puede usar MainWindowTitle. – hungryMind

+0

Pero si el usuario crea un documento nuevo, MainWindowTitle es el título del nuevo documento, pero no sé si mi documento aún está abierto. Word también fusiona el proceso, por lo que si ya tengo una instancia de palabra en ejecución e inicio una nueva, la nueva saldrá al instante, por lo que el evento 'Process.Exited' no funciona para – MBulli

Cuestiones relacionadas