Pergunta

Quero escrever um complemento do Word que faça alguns cálculos e atualize alguma interface do usuário sempre que o usuário digitar algo ou mover o ponto de inserção atual.Olhando os documentos do MSDN, não vejo nenhuma maneira óbvia, como um evento TextTyped no documento ou nos objetos do aplicativo.

Alguém sabe se isso é possível sem pesquisar o documento?

Foi útil?

Solução

Como você provavelmente já descobriu, Word tem eventos, mas são para ações realmente grosseiras, como abrir um documento ou mudar para outro documento.Suponho que a MS fez isso intencionalmente para evitar que uma macro de baixa qualidade retardasse a digitação.

Resumindo, não existe uma ótima maneira de fazer o que você deseja. Um Word MVP confirma isso neste tópico.

Outras dicas

Na verdade existe uma maneira de executar algum código quando uma palavra for digitada, você pode usar SmartTags, e substituir o método Recognize, este método será chamado sempre que uma palavra for digitada, ou seja, sempre que o usuário digitar algum texto e clicar no espaço , tab ou teclas enter.

um problema com isso, entretanto, é que se você alterar o texto usando "Range.Text", ele irá detectá-lo como uma mudança de palavra e chamar a função para que possa causar loops infinitos.

Aqui está um código que usei para conseguir isso:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top