防止Excel退出

chi*_*oro 11 c# com excel interop excel-2007

我错过了一个Excel.Application.Quit或一个Excel.Application.BeforeQuit事件.有人知道模仿这些事件的解决方法吗?

我通过COM Interop从C#WinForms应用程序访问Excel.给定一个Excel.Application对象,我该怎么做:

  1. 最好是防止Excel退出?
  2. 如果这不可能,我怎么能至少注意到 Excel退出的时候?

请注意:由于我有一个COM引用Excel.Application,当Excel被用户"退出"时,Excel进程不会退出.虽然这听起来很矛盾,但事实就是如此.通过"退出"我的意思是用户点击窗口右上角的"退出"或"十字按钮".窗口关闭,文件被卸载,加载项被卸载以及Excel除了我没有任何线索之外做的任何东西.但是我仍然可以使用该Application对象来"恢复"该过程并使Excel再次可见,尽管这些加载项随后丢失,而且我还不知道还有什么处于未定义状态.

为了摆脱这个问题,我想在一开始就取消退出(想想BeforeQuit Cancel = true它是否存在),或者至少在退出Excel时得到通知,这样我就可以释放COM对象并使流程真正退出,下次我再次需要Excel时,我会知道我需要先启动它.

不幸的是,它是一个恶性循环:只要Excel运行,我需要COM对象.因此, Excel退出之前,我无法处理它们.另一方面,只要COM对象存在,即使Excel假装退出,进程也不会退出,因此我不能等待进程退出事件或类似事件.

我有一种令人不快的感觉,就是我要把头撞在砖墙上......

sha*_*esh 7

请注意,我没试过这个.

创建一个包含代码的工作簿BeforeClose.
例如

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cancel = True
End Sub
Run Code Online (Sandbox Code Playgroud)

打开此工作簿以及您拥有的其他工作簿,并且不必隐藏它(如果整个应用程序不可见).

因此,如果您尝试退出excel实例,它将强制关闭此隐藏工作簿,这将提升其BeforeClose事件并且您可以编写代码以阻止它关闭.

请注意,上面的代码是VB6(VBA),需要转换为c#.
发表评论,如果您发现转换有任何困难.

如果要隐藏工作簿,可以这样做

Workbooks("my workbook").Windows(1).Visible = False 
Run Code Online (Sandbox Code Playgroud)

注意:工作簿有一个Windows集合.上面的代码试图隐藏第一个窗口.
我不知道,一本工作簿可以有多个窗口吗?如果是这样,怎么样?


Tod*_*ain 5

有一篇知识库文章,如何自动化Excel,然后知道用户在C++中关闭了它.我没有把它移植到C#,但它可能不是很多工作.

  • @chiccodoro:它不会释放它们,除非你也想要它们.所有代码都在清理事件处理程序中的东西,`OnSeexlquit`.在那个事件处理程序中,你可以做任何你喜欢的事情,比如保存你的文件等等.它告诉你的是Excel将要退出(X点击退出),所以关闭正确的东西并清理.这回答了你上面的#2,而不是你的#1. (2认同)