Ms word 如何使用VSTO检测Word中的文本和光标位置变化

Ms word 如何使用VSTO检测Word中的文本和光标位置变化,ms-word,ms-office,vsto,Ms Word,Ms Office,Vsto,我想写一个word插件,每当用户键入某个内容或移动当前插入点时,它都会执行一些计算并更新一些ui。通过查看MSDN文档,我看不到任何明显的方式,例如文档或应用程序对象上的TextTyped事件 有人知道不轮询文档是否可以做到这一点吗?正如您可能已经发现的,但它们用于真正粗糙的操作,例如打开文档或切换到另一个文档。我猜微软这样做是为了防止一个糟糕的宏减慢打字速度 简言之,做你想做的事没有好方法 正如您可能已经发现的,但它们用于真正粗糙的操作,例如打开文档或切换到另一个文档。我猜微软这样做是为了防止

我想写一个word插件,每当用户键入某个内容或移动当前插入点时,它都会执行一些计算并更新一些ui。通过查看MSDN文档,我看不到任何明显的方式,例如文档或应用程序对象上的TextTyped事件


有人知道不轮询文档是否可以做到这一点吗?

正如您可能已经发现的,但它们用于真正粗糙的操作,例如打开文档或切换到另一个文档。我猜微软这样做是为了防止一个糟糕的宏减慢打字速度


简言之,做你想做的事没有好方法

正如您可能已经发现的,但它们用于真正粗糙的操作,例如打开文档或切换到另一个文档。我猜微软这样做是为了防止一个糟糕的宏减慢打字速度


简言之,做你想做的事没有好方法

事实上,有一种方法可以在键入单词后运行某些代码,您可以使用SmartTags并覆盖Recognite方法。每当键入单词时,就会调用此方法,这意味着每当用户键入一些文本并按空格键、制表符键或enter键时

但是,这其中的一个问题是,如果您使用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;
    }
}

事实上,有一种方法可以在键入单词后运行一些代码,您可以使用SmartTags并重写Recognite方法。每当键入单词时,就会调用此方法,这意味着每当用户键入一些文本并按空格键、制表符键或enter键时

但是,这其中的一个问题是,如果您使用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;
    }
}

事实证明,这是可能的,但只能通过使用低级键盘挂钩和进程外低级鼠标挂钩。@BenChilds不幸的是,Wayne的链接已断开,而且它不在WaybackTimeMachine上,除了此之外,您是否有任何关于如何做到这一点的链接?事实证明,这是可能的,但只能通过使用低级键盘挂钩,还有一个进程外的低级鼠标钩子。@BenChilds不幸的是,Wayne的链接断了,而且它不在WaybackTime机器上,你有什么关于如何做的链接吗?非常有趣。对于子孙后代,我看到Word/Excel 2010不推荐使用智能标记。非常有趣。对于子孙后代,我看到Word/Excel 2010不推荐使用智能标记。