关闭MS Office C#控制台

Nic*_*ick 0 c# automation interop ms-word ms-office

我正在编写一个自动化测试来确定MS Word是否成功打开了rtf文件.到目前为止,我遍历给定目录中的所有rtf并打开它们.稍后我将捕获异常以生成报告(记录崩溃的文件名).

我正在处理大量文件.我的应用程序当前正在为每个文件打开一个新的Word实例.谁能告诉我如何关闭Word?

public class LoadRTFDoc
{
    private object FileName;
    private object ReadOnly;
    private object isVisible;
    private object Missing;
    private ApplicationClass WordApp;
    private object Save;
    private object OrigFormat;
    private object RouteDoc;

    public LoadRTFDoc(object filename)
    {
        this.WordApp = new ApplicationClass();
        this.FileName = filename;
        ReadOnly = false;
        isVisible = true;
        Missing = System.Reflection.Missing.Value;
        Save = System.Reflection.Missing.Value;
        OrigFormat = System.Reflection.Missing.Value;
        RouteDoc = System.Reflection.Missing.Value;

    }


    public void OpenDocument()
    {
        WordApp.Visible = true;
        WordApp.Documents.Open(ref FileName, ref Missing, ref ReadOnly, ref Missing, ref Missing,
                                   ref Missing, ref Missing, ref Missing, ref Missing, ref Missing, ref Missing,
                                   ref isVisible, ref Missing, ref Missing, ref Missing, ref Missing);
        WordApp.Activate();
    }
    public void CloseDocument()
    {
        WordApp.Documents.Close(ref Save, ref OrigFormat, ref RouteDoc);
    }

}
Run Code Online (Sandbox Code Playgroud)

我打开每个文档后执行CloseDocument()方法.任何人对此有一些了解吗?

Dir*_*mar 5

WordApp.Quit() 
Run Code Online (Sandbox Code Playgroud)

将退出该应用程序.

但是,最安全的方法是获取进程的句柄并终止winword进程.在C#中,以下代码会这样做:

foreach (Process p in Process.GetProcessesByName("winword"))
{
    if (!p.HasExited)
    {
        p.Kill();
    }
}
Run Code Online (Sandbox Code Playgroud)

原因是它经常发生(我假设,特别是因为你正在测试不是由Word创建的文档),Word将挂起一个打开的消息框,例如修复对话框.在这种情况下,终止进程是关闭应用程序的最简单方法.

我建议你先尝试使用关闭Word Application.Quit.如果这不起作用,则表示输入文件存在问题(很可能是因为修复对话框阻止了Word).您应该将此记录为日志中的错误,然后继续终止winword进程.

您可能遇到的另一个问题是Word的文档恢复功能在启动时阻止应用程序(从而防止在单击恢复对话框之前打开文档).可以通过在启动Word之前删除HKCU和HKLM下的以下注册表项来禁用文档恢复(将Word 12.0替换为11.0,将Word XP替换为10.0):

Software\Microsoft\Office\12.0\Word\Resiliency
Run Code Online (Sandbox Code Playgroud)

毫无疑问,杀死Word是一种相当粗鲁的方法,然而,它很简单而且非常强大.上面的代码只会杀死用户的任何Word实例.如果你只想杀死一个特定的实例,事情变得更加困难.您必须检索特定Word实例的进程ID.通常,这可以通过搜索实例的窗口标题来完成,例如使用FindWindowByCaption和等的WinAPI函数GetWindowThreadProcessId.