c# - 当用户关闭主窗口时,PowerPoint 进程不会关闭

标签 c# process automation ms-office powerpoint

如果我通过自动化创建 PowerPoint 应用程序,当用户关闭主窗口时,该过程仍保留在任务管理器中。我可以假设这是因为我的应用程序持有对 PowerPoint 应用程序的引用,因此无法对其进行垃圾回收。但是我怎么知道用户关闭了 PowerPoint 应用程序以便我可以释放对它的所有引用?这里似乎是先有鸡还是先有蛋的问题。下面是我在表单加载时调用的函数。如果 PowerPoint 已打开,它将使用当前实例。如果没有,它会创建一个新实例。

Private Function TryAttachToApplication() As PowerPoint.Application
        Dim app As PowerPoint.Application

        Try
            app = CType(Marshal.GetActiveObject("PowerPoint.Application"), PowerPoint.Application)
        Catch ex As COMException
            app = New PowerPoint.Application
        End Try

        app.Visible = True
        Return app
End Function

最佳答案

If PowerPoint is already opened, it uses the current instance. If not, it creates a new instance.

我不这么认为。 PowerPoint 只允许自身的一个实例,但有时它在自动化时可能会错误地留下僵尸实例。它不像 Word 或 Excel,您可以在其中根据需要创建自己的附加实例。

如果已经有一个实例在运行,您将获得对它的引用。 如果没有正在运行的实例,您将创建一个新实例并获取对该实例的引用。

释放对 PPT 实例的引用不应导致任何问题。如果用户一开始就打开它,它应该保持打开状态。

问题更可能是:“我是否应该调用PPT应用程序的.Quit方法?”

一种方法是检查 app.Presentations.Count 我不记得当通过 Automation 调用 PPT 时是否会自动创建一个新的空白演示文稿;我记得,它没有,但你会想要仔细检查一下。 IAC,如果 .Count > 0(或者可能是 1),您知道您已经获得了对 PPT 的预先存在实例的引用......即,有人已经在使用它......所以你不想退出他们。

关于c# - 当用户关闭主窗口时,PowerPoint 进程不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10433507/

相关文章:

c# - 没有 OrderedDictionary 的通用实现?

c# - 显示分层数据的 WPF 组合框

c# - 如何将 NameValueCollection 转换为 JSON 字符串?

python - 如何使用 AntiCaptcha 解决 FunCaptcha/RotateCaptcha?

azure - 有没有办法从 Azure 自动化帐户的混合工作组中删除过时的机器工作人员?

c# - Int32.Parse 与 Single.Parse - ("1,234") 和 ("1,2,3,4")。为什么 int 和浮点类型以不同方式解析分隔符?

java - 尝试使用 Runtime.getRuntime().exec() 执行 Java jar

linux - ps h -fwC 有什么作用?

c - 获取pid的进程名

javascript - 遍历 JavaScript InDesign 脚本中的所有线程文本框架?