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





Как вы, наверное, заметили, В слове есть события, но они предназначены для действительно грубых действий, таких как открытие документа или переключение на другой документ. Я предполагаю, что MS сделала это намеренно, чтобы не дать паршивому макросу замедлить набор текста.
Короче говоря, нет отличного способа делать то, что вы хотите. Word MVP подтверждает это в этой ветке.
@BenChilds К сожалению, ссылка Уэйна не работает, и ее нет на WayBackkTimeMachine, есть ли у вас какие-либо ссылки, кроме очевидный, о том, как это сделать?
На самом деле есть способ запустить некоторый код, когда слово было набрано, вы можете использовать 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;
}
}
Очень интересно. Я вижу, что для потомков смарт-теги устарели для Word / Excel 2010.
Оказывается, это возможно, но только при использовании низкоуровневых хуков клавиатуры и внепроцессных низкоуровневых ловушек мыши.