Как обнаружить изменения положения текста и курсора в Word с помощью VSTO

StackOverflow https://stackoverflow.com/questions/55735

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Однако одна проблема заключается в том, что если вы измените текст с помощью «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;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top