2011-02-09 14 views
5

per il nostro progetto scolastico abbiamo bisogno di avviare un'istanza di parola e tracciare se il documento è stato chiuso. Il COM api dalla parola non ha un evento per questo, ci sono altri modi per farlo?Avvia Word e controlla se il documento è chiuso

Attualmente stiamo usando la COM api dalla parola, ma tutto il resto andrebbe bene. Stiamo programmando in C#.

+0

Sarebbe questo aiuto? http://stackoverflow.com/questions/4329521/how-to-handle-word-close-event-from-winforms-application – Koen

+1

Abbiamo provato anche questo, ma abbiamo notato se esisteva già un word proc con cui il nostro nuovo proc è fuso la corsa. Ospitiamo anche un'anteprima quindi c'è sempre un processo verbale. – MBulli

risposta

2

Se la vostra utilizzando la libreria Microsoft.Office.Interop.Word c'è un evento si può iscrivere anche:

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 
} 

Edit:

Per occuparsi del blocco dei file ==> dai un'occhiata a this post. Come puoi vedere, nella DocumentBeforeClose sono presenti alcune operazioni:

  1. Verificare se il documento è stato salvato. Altrimenti, ==> chiedi dove salvarlo e fallo tu stesso.
  2. chiudere il documento da soli
  3. Chiudere Word

Dopo queste cose sono presi cura di, si può fare le tue cose. Il blocco dovrebbe essere rilasciato.

+0

Ma abbiamo bisogno di un evento per AfterClosed, lo abbiamo fatto per BeforeSaved con un ciclo asincrono durante il controllo doc.Saved == true ma non abbiamo trovato nulla di simile per BeforeClose – MBulli

+0

E cosa devi fare una volta che sai che il documento è chiuso? – Koen

+0

Leggi tutti i byte del documento e inseriscilo in un db. Il problema è che la parola contiene un blocco di file, mentre è aperto. – MBulli

2

Utilizzare la procedura di Winword per verificare se il processo in esecuzione su un file specifico viene chiuso o meno.

Se non si conosce il processo dell'istanza appena avviata, utilizzare questa operazione o semplicemente aggancio dell'evento di processo.

Ricevi tutte parola elabora

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

identificare il processo di particolare file utilizzando Process.MainWindowTitle

Hook evento uscito del processo Process.Exited

+0

Okay dovrebbe funzionare, ma cosa succede se l'utente crea un nuovo documento in parola? – MBulli

+0

non importa chi ha creato il processo. Otterrai sempre il processo utilizzando GetProcessByName. Se vuoi monitorare una specifica istanza di parole, puoi usare MainWindowTitle. – hungryMind

+0

Ma se l'utente crea un nuovo documento, MainWindowTitle è il titolo del nuovo documento, ma non so se il mio documento è ancora aperto. Word unisce anche il processo quindi se ho già un'istanza di parola in esecuzione e ne avvio uno nuovo, il nuovo uscirà immediatamente, quindi l'evento 'Process.Exited' non funziona – MBulli