2012-10-01 67 views
5

Ni el evento NewDocument ni el evento DocumentOpen se activan cuando se carga por primera vez Microsoft Word. Cuando una instancia de Word ya está abierta y se abre un documento nuevo o existente, estos eventos funcionan bien.Cómo controlar el evento Word DocumentChange ya que el evento NewDocument no se activa en la carga

La sugerencia que he visto es manejar el evento DocumentChange (que siempre se activa cuando se carga Word) en lugar de los otros dos eventos.

Mi pregunta es ¿cómo voy a hacer esto? El evento DocumentChange no tiene ningún parámetro, ¿cómo sabría cuándo se acaba de abrir el documento (nuevo o existente)?

Además, ya tengo lógica en el evento DocumentChange y el procesamiento de los documentos nuevos y existentes es diferente, así que no puedo simplemente arrojar todo mi código al evento.

private void ThisAddIn_Startup(object sender, System.EventArgs a) 
{ 
    this.Application.DocumentChange += new ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange); 
} 

private void Application_DocumentChange() 
{ 
    // How do I handle NewDocument or DocumentOpen? 
} 

Respuesta

2

Así que terminé procesando el documento cargado en ThisAddIn_Startup. Si la ruta del documento es una cadena vacía, entonces sabemos que el documento es nuevo y nunca se ha guardado en la máquina local. De lo contrario, sé que está guardado (incluso en el directorio temporal) y lo proceso como un documento existente.

private void ThisAddIn_Startup(object sender, System.EventArgs a) 
{ 
    try 
    { 
    Word.Document doc = this.Application.ActiveDocument; 
    if (String.IsNullOrWhiteSpace(doc.Path)) 
    { 
     ProcessNewDocument(doc); 
    } 
    else 
    { 
     ProcessDocumentOpen(doc); 
    } 
    } 
    catch (COMException e) 
    { 
    log.Debug("No document loaded with word."); 
    } 

    // These can be set anywhere in the method, because they are not fired for documents loaded when Word is initialized. 
    ((MSWord.ApplicationEvents4_Event)this.Application).NewDocument += 
    new MSWord.ApplicationEvents4_NewDocumentEventHandler(Application_NewDocument); 
    this.Application.DocumentOpen += 
    new MSWord.ApplicationEvents4_DocumentOpenEventHandler(Application_DocumentOpen); 
} 

Como mi comentario para estados respuesta de Deni: Configuración del controlador de eventos DocumentOpen en Inicializar de ThisAddIn.Desiger.cs() método funcionó para los documentos existentes, pero NewDocument no es llamado para un nuevo documento inicializado cuando Word abre, entonces esta solución no funcionó. Así que dejé la configuración de DocumentOpen y NewDocument en el evento ThisAddIn_Startup, de lo contrario, se disparará DocumentOpen cuando un documento se carga con Word también.

2

This enlace le ayudará a, básicamente, lo que dicen es que corre ThisAddIn_Startup después caso DocumentOpen ha terminado de ejecutarse. También hay una solución para el problema simplemente siga el hipervínculo.

+0

Esto funciona perfectamente para _DocumentOpen pero no funciona para _NewDocument. Recuerdo haber leído en alguna parte que _NewDocument solo se activa cuando un usuario hace File-> New y no cuando Word abre con un nuevo documento. Si esto es cierto, ¿alguna idea sobre cómo manejar un documento nuevo cuando se abre Word? _WindowActivate se dispara cada vez que Word gana foco, no solo la primera vez que se abre Word. Así que podría tratar de manejar _WindowActivate, pero siento que eso podría ser complicado. ¿Pensamientos? –

1

He utilizado la colección Application.Documents en el controlador de inicio para encontrar todos los documentos existentes antes de las cargas de mi complemento. Logra lo mismo que su respuesta, además, si carga el complemento más tarde a petición (en lugar de cuando se inicia Word) por cualquier razón, enumerar la colección puede obtener más que solo el documento activo.

El evento DocumentChange() se activa cada vez que ActiveDocument cambia. Word solo tiene un documento activo a la vez. Al cambiar entre múltiples documentos abiertos de Word, se desencadenará el evento. Además, al cerrar documentos, el evento podría activarse a medida que otro documento abierto se active. También se activa después de que se cierra el último documento, en cuyo caso, Application.ActiveDocument no será válido.

Cuestiones relacionadas