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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
3 333
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Оказывается, это возможно, но только при использовании низкоуровневых хуков клавиатуры и внепроцессных низкоуровневых ловушек мыши.

Ben Childs 18.12.2008 07:21

@BenChilds К сожалению, ссылка Уэйна не работает, и ее нет на WayBackkTimeMachine, есть ли у вас какие-либо ссылки, кроме очевидный, о том, как это сделать?

Jeremy Thompson 05.12.2016 06:19

На самом деле есть способ запустить некоторый код, когда слово было набрано, вы можете использовать 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.

Carl G 11.03.2011 13:48

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