Pregunta

Quiero escribir un complemento de Word que haga algunos cálculos y actualice alguna interfaz de usuario cada vez que el usuario escriba algo o mueva el punto de inserción actual.Al mirar los documentos de MSDN, no veo ninguna forma obvia, como un evento TextTyped en el documento o en los objetos de la aplicación.

¿Alguien sabe si esto es posible sin consultar el documento?

¿Fue útil?

Solución

Como probablemente habrás descubierto, Word tiene eventos, pero son para acciones realmente burdas como abrir un documento o cambiar a otro documento.Supongo que MS hizo esto intencionalmente para evitar que una mala macro ralentice la escritura.

En resumen, no existe una buena manera de hacer lo que quieres. Un MVP de Word lo confirma en este hilo.

Otros consejos

En realidad, hay una manera de ejecutar código cuando se ha escrito una palabra, puede usar SmartTags y anular el método Recognize, este método se llamará cada vez que se escriba una palabra, lo que significa que cada vez que el usuario escriba algún texto y presione el espacio. , tabulación o teclas Intro.

Sin embargo, un problema con esto es que si cambia el texto usando "Range.Text", lo detectará como un cambio de palabra y llamará a la función para que pueda causar bucles infinitos.

Aquí hay un código que utilicé para lograr esto:

public class AutoBrandSmartTag : SmartTag
{
    Microsoft.Office.Interop.Word.Document cDoc;

    Microsoft.Office.Tools.Word.Action act = new Microsoft.Office.Tools.Word.Action("Test Action");

    public AutoBrandSmartTag(AutoBrandEngine.AutoBrandEngine _engine, Microsoft.Office.Interop.Word.Document _doc)
        : base("AutoBrandTool.com/SmartTag#AutoBrandSmartTag", "AutoBrand SmartTag")
    {
        this.cDoc = _doc;

        this.Actions = new Microsoft.Office.Tools.Word.Action[] { act };
    }

    protected override void Recognize(string text, Microsoft.Office.Interop.SmartTag.ISmartTagRecognizerSite site, 
        Microsoft.Office.Interop.SmartTag.ISmartTagTokenList tokenList)
    {
        if (tokenList.Count < 1)
            return;

        int start = 0;
        int length = 0;
        int index = tokenList.Count > 1 ? tokenList.Count - 1 : 1;

        ISmartTagToken token = tokenList.get_Item(index);

        start = token.Start;
        length = token.Length;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top