【问题标题】:Kill process if Quit() does not work如果 Quit() 不起作用,则终止进程
【发布时间】:2014-04-04 08:01:18
【问题描述】:

我正在编写一个小程序,它将打开 Word、Excel 或 Powerpoint 文件,检查文件而不进行任何修改,然后再次退出相应的应用程序。例如。对于 Word,这看起来如下,适用于普通文档:

s_word.Quit(false);
Marshal.ReleaseComObject(s_word);
s_word = null;
GC.Collect();
GC.WaitForPendingFinalizers();

我还有一个计时器,如果它在 x 秒后没有退出,它应该退出应用程序。但是,如果弹出任何对话框等,我会遇到问题,例如打开文档时的密码提示。我会遇到超时,但上面的所有命令都不会退出应用程序。 所以我添加了一个硬进程终止方法,它将简单地查找所有 WINWORD 进程并杀死它们。虽然这可行,但我想避免一些陷阱。比如下次你打开失败的文档时,Word会询问你是否修复它等。

那么,有没有更好的方法来强制 Office 应用程序退出?

【问题讨论】:

  • 我无法解决您的问题,但您可以尝试“Open XML SDK 2.5 for Office”而不是使用 office interopt,我不确定它可以打开哪些文件,但至少它不会启动新进程当你打开文件时。
  • 我主要有旧的(非 xml)Office 文件,所以这不是一个真正的选择。
  • 我在使用它时总是做的事情是我实现 IDisposable 并覆盖 Dispose 方法。

标签: c# excel ms-word powerpoint office-interop


【解决方案1】:

我创建了一个非常幼稚的 sn-p,它应该允许您获取刚刚启动的 Office 程序实例的进程,但不会影响其他人。然后您可以调用 processInstance.Kill() 来结束它。

        Process[] oldRunningWordInstances = Process.GetProcessesByName("Microsoft Word");
        Word.Application application = new Word.Application();
        Process[] newRunningWordInstances = Process.GetProcessesByName("Microsoft Word");
        Process applicationProcess = null;
        foreach (Process p in newRunningWordInstances)
            if (!oldRunningWordInstances.Contains(p))
            {
                applicationProcess = p;
                break;
            }

        applicationProcess.Kill();

这种获取进程(id)的方法在理论上是不可靠的。可能有更好的解决方案来获取流程。

【讨论】:

  • 谢谢,我以前见过这个,但最后这与我现在所做的并没有什么不同。我不想以某种方式终止进程......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2017-12-08
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多