捕获“保存对话框”的取消状态,以便处理未保存更改的MS Word文档即将关闭。

3
我有一个用C#编写的Microsoft Word插件。当用户尝试关闭未保存更改的文档时,将显示保存对话框。是否有一种方法可以捕获用户在保存对话框上单击取消的情况?
DocumentBeforeClose事件会在保存对话框弹出之前烦人地触发,似乎没有事件封装保存对话框事件。
为什么需要这样做: 如果用户关闭最后一个文档,我需要在我的插件工具栏上进行一些清理。但是,如果我在DocumentBeforeClose事件中进行清理,并且用户单击取消,则插件工具栏状态不正确。
编辑/更新: 正如Rob Allen建议的那样,我现在正在使用ShutDown事件来清理我的父对象和BeforeClose事件用于我的父对象的预关闭验证。我的验证需要保存文档并尝试通过BeforeClose调用的方法来完成。如果文档以前从未保存过,则会出现Save As对话框。如果用户单击取消,将抛出COMException并由我捕获。然后出现“保存/不保存/取消”对话框。如果用户单击“不保存”,则不会触发ShutDown事件。如果用户从另一个对话框中保存,或者在第二个对话框中点击取消,则所有内容都能正常运行。
private void WordDocument_BeforeClose(object sender, System.ComponentModel.CancelEventArgs e)
{
  try
  {
    this.WordDocument.Save();
  }
  catch (System.Runtime.InteropServices.COMException a)
  {
    log.Error(a.Message);
  }
}

private void WordDocument_Shutdown(Object sender, EventArgs e)
{
  // Parent cleanup.
}
1个回答

2
尝试使用文档关闭事件。文档此处有说明。
从“备注”部分:
这是在卸载文档时调用的最后一个事件。使用此事件进行任何其他清理。
在文档级别的自定义中,当文档宿主项关闭时,程序集的应用程序域将卸载。
在应用程序级别的插件中,文档宿主项关闭时应用程序域不会卸载。此外,底层文档对象也不再可用。要在文档关闭之前访问文档,请改用CloseEvent。

似乎关闭事件不一致... 对于保存和不保存它并不总是触发(对于取消操作它确实从未触发)... 有什么想法吗? - Joe W
Application.Quit不是用来关闭Word的吗?我正在处理的情况是当最后一个文档本身关闭时,Word仍然保持打开状态。 - Joe W
我不知道用户关闭文档而不是整个Word的频率有多高,但很可能大于0,所以我需要处理这种情况。当Word加载时,我正在加载插件代码,当打开/创建文档时,我正在加载文档代码。集成点放置在正确的位置,并且没有延迟,因为文档清理/设置仅涉及从文档中删除/添加事件处理程序并禁用/启用插件按钮。 因此回到问题:关闭事件不一致,似乎存在线程问题或类似的问题。 你有什么想法? - Joe W
抱歉,我可能没有表达清楚。如果用户点击取消,则文档保持打开状态,未保存,并且ShutDown事件不会触发,这是正确的。如果用户点击保存,则文档将保存、关闭,并触发ShutDown事件,这也是正确的。然而,如果用户点击“不保存”,则文档将关闭且未保存更改(这是正确的),但ShutDown事件不会触发。 - Joe W
因为您的回答解决了我的初始问题,所以我将其标记为答案。我创建了一个新问题(http://stackoverflow.com/questions/12749411/shutdown-event-is-not-always-fired-when-saving-a-word-ducment-during-beforeclose),详细说明我现在遇到的新问题。 - Joe W
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接