Как определить изменения текста и положения курсора в Word с помощью VSTO - PullRequest
1 голос
/ 11 сентября 2008

Я хочу написать слово addin, которое выполняет некоторые вычисления и обновляет пользовательский интерфейс всякий раз, когда пользователь что-то печатает или перемещает текущую точку вставки. Из документов MSDN я не вижу очевидных путей, таких как событие TextTyped для документа или объектов приложения.

Кто-нибудь знает, возможно ли это без опроса документа?

Ответы [ 2 ]

3 голосов
/ 23 июня 2009

На самом деле есть способ запустить некоторый код, когда слово набрано, вы можете использовать SmartTags и переопределить метод Recognize, этот метод будет вызываться всякий раз, когда слово вводится, что означает всякий раз, когда пользователь вводит некоторый текст и нажмите пробел, табуляцию или клавиши ввода.

одна проблема с этим, однако, заключается в том, что если вы измените текст, используя «Range.Text», он обнаружит его как изменение слова и вызовет функцию, так что это может вызвать бесконечные циклы.

Вот код, который я использовал для достижения этой цели:

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;
    }
}
1 голос
/ 11 сентября 2008

Как вы, вероятно, обнаружили, Word имеет события , но они предназначены для действительно грубых действий, таких как открытие документа или переключение на другой документ. Я предполагаю, что MS сделал это намеренно, чтобы не дать дерьмовому макросу замедлить набор текста.

Короче говоря, нет отличного способа сделать то, что вы хотите. Слово MVP подтверждает это в этой теме.

...