我的应用程序中有一个类似Windows资源管理器的模块。 我想处理打开和关闭该模块中的单词和excel文件。 当我打开f.e.同时4-5个文件,关闭处理程序无法正常工作。
问题是:有时关闭Word应用后,我的应用不会在wordDocEvents_DocumentBeforeClose函数开头的断点处停止。 似乎与进程间通信有关,因为每个打开的文档都是一个新进程。
如果已知问题请帮助,否则我会尝试在我的代码中执行某些操作。
代码快照:
if (_wordApp == null)
{
_wordApp = new Word.Application();
_wordDocEvents = (Word.ApplicationEvents4_Event)_wordApp;
if (!isLocked)
{
//_wordDocEvents.Quit += new Word.ApplicationEvents4_QuitEventHandler(wordDocEvents_Quit);
_wordDocEvents.DocumentBeforeClose += new Word.ApplicationEvents4_DocumentBeforeCloseEventHandler(wordDocEvents_DocumentBeforeClose);
_wordDocEvents.DocumentBeforeSave += new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(wordDocEvents_DocumentBeforeSave);
_wordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;
}
}
_wordApp.Visible = true;
Word.Document oDoc = _wordApp.Documents.Open(fileName, null, isLocked);
oDoc.Activate();
_wordApp.Visible = true;
_wordApp.Activate();
关闭处理程序:
void wordDocEvents_DocumentBeforeClose(Word.Document doc, ref bool Cancel)
{
if (!doc.Saved)
{
MessageBoxResult res = MessageBox.Show(ApplicationValues.GetResourceString("library_file_save_changes"), "", MessageBoxButton.YesNoCancel, MessageBoxImage.Question, MessageBoxResult.Yes, System.Windows.MessageBoxOptions.DefaultDesktopOnly);
switch (res)
{
case MessageBoxResult.Yes:
doc.Save();
break;
case MessageBoxResult.No:
doc.Saved = true;
break;
default:
Cancel = true;
return;
}
}
interopFileBeforeCloseHandler(doc.FullName, doc.ReadOnly);
}
答案 0 :(得分:0)
这是一个较旧的,但我在msdn找到这个帖子后想出来了: workbookbeforeclose-event-does-not-fire
所以一个相当简单的解决方案是将所有创建/加载的文档存储到数组/列表/ ...以便垃圾收集器在它认为需要时不处理它们,从而清除所有事件处理程序
对我来说像是一种魅力;)