我缺少 Excel.Application.Quit
或 Excel.Application.BeforeQuit
事件。 有人知道模拟这些事件的解决方法吗?
我通过 COM Interop 从 C# WinForms 应用程序访问 Excel。给定一个 Excel.Application
对象,我如何:
- 最好防止 Excel 退出?
- 如果这不可能,我如何才能至少在 Excel 退出时注意到?
请注意:因为我有一个对 Excel.Application
的 COM 引用,Excel 进程不会退出 当 Excel 被用户“退出”时。虽然这听起来很矛盾,但事实就是如此。 “退出”是指用户点击窗口右上角的“退出”或“十字按钮”。窗口关闭,文件被卸载,加载项被卸载,Excel 所做的一切我都不知道。但是我仍然可以使用 Application
对象来“恢复”该过程并使 Excel 再次可见,尽管加载项随后会丢失,而且我不确定还有什么处于未定义状态。
为了摆脱这个问题,我想在一开始就取消退出(想想 BeforeQuit
Cancel = true
如果它存在),或者至少在 Excel 退出时得到通知,这样我就可以释放 COM 对象并使进程真正退出,下次我再次需要 Excel 时,我会知道我需要先启动它。
不幸的是,这是一个恶性循环:只要 Excel 运行,我就需要 COM 对象。所以我不能在 Excel 退出之前处理它们。另一方面,只要 COM 对象存在,即使 Excel 假装退出,进程也不会退出,所以我不能等待进程退出事件或类似事件。
我有一种不愉快的感觉,我要用我的头去撞砖墙......
最佳答案
请注意,我还没有尝试过这个。
在 BeforeClose
上创建一个包含代码的工作簿。
例如
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = True
End Sub
打开此工作簿以及您拥有的其他工作簿,它不必隐藏(如果整个应用程序不可见)。
因此,如果您尝试退出 excel 实例,它将强制关闭这个隐藏的工作簿,这将引发其 BeforeClose
事件,您可以编写代码来阻止它关闭。
请注意,以上代码是在 VB6 (VBA) 中,需要转换为 C#。
如果您发现转换有任何困难,请发表评论。
如果你想隐藏一个工作簿,你可以这样做
Workbooks("my workbook").Windows(1).Visible = False
注意:工作簿有一个 Windows
集合。上面的代码试图隐藏第一个窗口。
我不知道,一个工作簿可以有多个窗口吗?如果是,怎么办?
关于c# - 防止 Excel 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3724301/