每当特定的MS Word应用程序实例退出时,我需要运行一些逻辑。我正在使用Microsoft.Office.Interop.Word
来:
- 创建我的 Word 应用程序实例
- 打开文档
- 选择一些表单域并更改其文本。
- 使 Word 应用程序对用户可见以进行交互。
-
用户交互后,使用
Microsoft.Office.Interop.Word.ApplicationEvents4_Event.Quit
事件处理程序捕获退出事件(当用户退出 Word 时(
我正在使用一台现代计算机来开发运行 Office 365 (Word 16( 的应用程序,该事件在第一次尝试时会毫无问题地触发。
但是,在运行 Word 2007 的较旧计算机上(必须部署我正在开发的程序(,该事件仅在第二次创建实例后触发。我觉得很奇怪。
这是我的代码。它在 WinFormsbtn_click
事件中运行。
//instantiate word application
Microsoft.Office.Interop.Word.Application wordApp = null;
wordApp = new Microsoft.Office.Interop.Word.Application();
//open document
Document wordDoc = wordApp.Documents.Open(WordDocumentPath);
//use a dictionary to fill in the form fields
foreach (KeyValuePair<string, string> fieldValue in FieldsValues)
{
FormField formField = wordDoc.FormFields[fieldValue.Key];
formField.Select();
formField.Result = fieldValue.Value;
}
//make Word UI visible and bring to front
wordApp.Visible = true;
wordDoc.Activate();
wordApp.Activate();
//handle quit event
ApplicationEvents4_Event wordEvents = wordApp;
wordEvents.Quit += OnWordQuit;
OnWordQuit()
方法上,我将运行一些逻辑,但现在我只使用消息框
//only runs on Word 2007 when I click the button for the second time
private void OnWordQuit()
{
MessageBox.Show("OnWordQuit");
}
我想问题是您将事件处理程序OnWordQuit
附加到局部变量wordEvents
的Quit
属性,该属性仅存在于您btn_click
事件处理程序中。
一旦事件处理程序完成btn_click
此变量就会超出范围。那是在 Word 实际关闭之前很久,wordEvents.Quit
事件处理程序可能会转到 garbadge,并且没有任何反应可以对此做出反应。
尝试在 Form 类上声明ApplicationEvents4_Event wordEvents
字段,并将事件处理程序分配给此字段。您的代码应像这样更改:
//ApplicationEvents4_Event wordEvents = wordApp;
this.wordEvents.Quit += OnWordQuit; // field or property ApplicationEvents4_Event wordEvents should be defined on the form class
通过这种方式,您将确保只要您的表单处于打开状态,OnWordQuit 就会存活下来......