如何使用VSTO检测Word中的文本和光标位置更改

时间:2008-09-11 03:05:48

标签: ms-word ms-office vsto

我想写一个单词addin做一些计算,并在用户输入内容或移动当前插入点时更新一些ui。从查看MSDN文档,我没有看到任何明显的方法,如文档或应用程序对象上的TextTyped事件。

有人知道这是否可以在不轮询文件的情况下进行?

2 个答案:

答案 0 :(得分:3)

实际上有一种方法可以在输入一个单词时运行一些代码,你可以使用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 :(得分:1)

正如您可能已经发现的那样,Word has events,但它们是非常粗略的操作,例如文档打开或切换到另一个文档。我猜测MS故意这样做是为了防止蹩脚的宏减慢打字速度。

简而言之,没有什么好办法可以做你想做的事。 A Word MVP confirms that in this thread.