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

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

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


person Ben Childs    schedule 11.09.2008    source источник


Ответы (2)


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

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

person Wayne Kao    schedule 11.09.2008
comment
Оказывается, это возможно, но только с использованием низкоуровневых клавиатурных хуков и внепроцессного низкоуровневого хука мыши. - person Ben Childs; 18.12.2008
comment
@BenChilds К сожалению, ссылка Уэйна не работает, и ее нет на WayBackkTimeMachine, есть ли у вас какие-либо ссылки о том, как это сделать, кроме очевидный? - person Jeremy Thompson; 05.12.2016

На самом деле есть способ запустить некоторый код, когда слово было набрано, вы можете использовать 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;
    }
}
person Sebastian Bender    schedule 23.06.2009
comment
Очень интересно. Для потомков я вижу, что смарт-теги устарели для Word/Excel 2010. - person Carl G; 11.03.2011