word 对象模型 - 单击 FILE 时的活动文档事件

word object model - active document event when clicking on FILE

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

WindowDeactivate 没有达到这个目的。

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

TL:DR;当用户单击菜单中的文件选项并且当前文档不可见时,是否有一种方法可以在 MS Word 中进行检测?我正在使用 add-in-express,所以所有相关的词对象模型 API 都可用。

我想知道我该如何解决这个问题,感谢您的帮助。

编辑:截图

Word 将触发 Application.DocumentOpen 事件 - 您可以在 OfficeSpy 中看到它(我是它的作者 - 单击“应用程序”按钮,转到“事件”选项卡,查看底部的日志window).

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

可在此处找到参考 material:

Performing Actions When the Backstage View is First Displayed or Hidden

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

解决方案树

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

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

<?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)

这些代码中有一部分是样板文件,但是 public void onShow 是根据功能区自定义 XML 中的 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 class 来实例化自定义功能区。