c# - 防止 Excel 退出

标签 c# excel com interop excel-2007

我缺少 Excel.Application.QuitExcel.Application.BeforeQuit 事件。 有人知道模拟这些事件的解决方法吗?

我通过 COM Interop 从 C# WinForms 应用程序访问 Excel。给定一个 Excel.Application 对象,我如何:

  1. 最好防止 Excel 退出?
  2. 如果这不可能,我如何才能至少在 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/

相关文章:

c# - 在 C# 中使用 FTP 复制文件

java - 如何使用 Apache POI (SXSSF) 设置特定单元格的数据(数字)格式区域设置?

c++ - 接收 COM 事件

SharePointOnlineCredentials 引发 ComException

c# - 身份验证失败时重定向到母版页中的页面不起作用

c# - 如何使用发送键将 Ctrl+Shift+F1 发送到应用程序

c# - 检测字符串中的垃圾字符

excel - 如何更改将鼠标悬停在评论框上时的位置?

Excel 网格查找

c++ - 在最佳时间从 _variant_t 获取 char*