关闭新的 WORD 文档后如何获得最终的 Document.FullPath 值?

How do you get the final Document.FullPath value AFTER closing a new WORD document?

我有一个 Office WORD 加载项。我想知道如何确定文档关闭后的最终完整路径名。

具体的问题场景是这样的。用户创建一个新的 WORD 文档,对文档进行编辑,然后关闭文档。

在加载项中,我检测到文档的创建。然后将触发 DocumentBeforeClose 事件。然后WORD提示"Do you want to save Document1?"。 Select 是的,DocumentBeforeSave 事件会触发。然后显示另存为对话框。用户提供完整路径并接受。 WORD 然后关闭。

我找不到对象模型方法或事件来捕获用户的选择。

...4 周没有答案,所以我会提出一个我自己的问题的答案...

我还没有找到 Office 对象模型方法或 属性 来解决这个问题。所以,我所做的是为 DocumentChange 事件注册一个处理程序。只要活动文档发生变化,它就会触发。当活动文档变为无效时,它似乎也会触发,就像文档关闭时一样。

在处理程序中,我检测最后一个活动文档是否无效(通过捕获异常)。然后我查看注册表中的WORD MRU,找到最近使用的word文档。

到目前为止,这种方法是有效和可靠的。但我觉得这是一种糟糕的方法。我欢迎更好更优雅的解决方案。这是我使用的代码...

private void Application_DocumentChange()
{
    // This event is fired every time the application sets a new active document, including
    // when the last active document is closed, in which case, Application.ActiveDocument
    // will be invalid.

    // Detect when a document has closed.
    // The previously active document is no longer active.  Check to see if the Doc object
    // is still valid.  If so, we can clear the IsClosing flag.  If not, we can assume it
    // was closed and queue it for post processing.
    if (_activeWrapper != null)
    {
        try
        {
            var lastDoc = _activeWrapper.Document();
            var path = lastDoc.FullName;
            _activeWrapper.IsClosing = false;  // set true in the close handler
        }
        catch (Exception ex)
        {
            if (_activeWrapper.IsClosing)
            {
                // last document has closed
                var path = RegistryTools.GetWordMRU(_appWrap.Version.ToString());
                // do post-close processing on file
            }
            _activeWrapper.Dispose();
        }
    }

    Word.Document doc = null;
    DocWrapper wrapper = null;
    try
    {
        doc = Application.ActiveDocument; //will throw exception on last close
    }
    catch (Exception ex)
    {
        //if this exception is due to an invalid active document, then we can treat the
       //event as an indication that the last document has closed.
       return;  // WORD Closing
    }

    // remember the current active document
    if(doc != null)
        wrapper = DocWrapper.GetWrapper(doc);
    _activeWrapper = wrapper;
}