0

我正在开发一个 MS Word 加载项。在较新的 MS Word 版本中,菜单栏中有“文件”选项,可打开一个界面,您可以在其中选择要打开的最近文档、打开新文档或现有文档。我试图找到一种方法,通过它我可以知道用户何时“离开”他正在编辑的当前文档,点击 Word 的 FILE 菜单。我似乎找不到这样的事件。有没有办法做到这一点?

WindowDeactivate不到这个目的。

我想这样做的原因是因为对于我正在编写的自定义拼写检查器,我以透明(也可以点击)形式突出显示错误的单词。因此,当用户在最新版本的 Word 中单击“文件”菜单时,高亮仍然存在,如屏幕截图所示

TL:博士;当用户单击菜单中的 FILE 选项并且当前文档不可见时,有没有办法在 MS Word 中进行检测?我正在使用 add-in-express,因此所有相关的词对象模型 API 都可用。

我想知道如何解决这个问题,不胜感激。

编辑:截图 在此处输入图像描述

4

2 回答 2

1

Word 将触发该Application.DocumentOpen事件 - 您可以在OfficeSpy中实时看到它(单击“应用程序”按钮,转到“事件”选项卡,查看窗口底部的日志)。

于 2021-03-18T22:57:45.437 回答
1

是的,您可以在单击“文件”菜单(显示 Backstage 视图)和单击视图的返回箭头以删除 Backstage 视图并显示文档时检测并执行代码。为此,请通过 VSTO 项目中的自定义 XML 功能区使用带有回调的onShowonHide属性(这不适用于使用 Visual Designer 制作的功能区)。

参考资料可以在这里找到:

在后台视图首次显示或隐藏时执行操作

由于本文使用 VBA 来扩展所涉及的概念,我构建了一个示例项目来演示如何onShow使用 C# 和 Word 2016 工作(文档是为 Office 2010 编写的,但onShowonHide在更高版本的 Word 中工作)。

解决方案树

在此处输入图像描述

自定义 XML 功能区 (BackstageRibbon.xml)

请注意,<backstage>激活onShow回调属性的<ribbon>节点位于 XML 中的节点之后。

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" 
onLoad="Ribbon_Load">
  <ribbon>
    <!--Ribbon XML goes here-->
  </ribbon>
  <backstage onShow="onShow">
  </backstage>
</customUI>

功能区代码 (BackstageRibbon.cs)

这段代码中有一部分是样板代码,但它是基于功能区自定义 XML 中public void onShow的属性执行代码的回调。onShow此外,public string GetCustomUI是告诉 C# 查找 XML 的地方。

namespace Backstage_Events
{
    [ComVisible(true)]
    public class BackstageRibbon : Office.IRibbonExtensibility
    {
        private Office.IRibbonUI ribbon;

        public BackstageRibbon()
        {
        }

        #region IRibbonExtensibility Members

        public string GetCustomUI(string ribbonID)
        {
            return GetResourceText("Backstage_Events.BackstageRibbon.xml");
        }

        #endregion

        #region Ribbon Callbacks
        //Create callback methods here. For more information about adding callback methods, visit https://go.microsoft.com/fwlink/?LinkID=271226

        public void Ribbon_Load(Office.IRibbonUI ribbonUI)
        {
            this.ribbon = ribbonUI;
        }

        public void onShow(object contextObject)
        {
            //Code to be executed before Backstage View displays goes here
            MessageBox.Show("Backstage Display Event Triggered!");
        }

        #endregion

        Helpers //Region
    }
}

ThisAddin.cs

您还需要添加:

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        return new BackstageRibbon();
    }

在类中的ThisAddIn_StartupThisAddIn_Shutdown私有空隙之后ThisAddin.cs实例化自定义功能区。

于 2021-03-27T01:05:54.910 回答