C#使用process.kill()关闭Word后重启仍打开旧文档,如何正常关闭开启新文档
解决方案
Process.Kill()属于强制终止进程的操作,Word会识别为异常崩溃退出,下次启动会自动触发恢复逻辑打开上次未正常关闭的文档。要实现和手动点击右上角关闭按钮一致的效果,可以参考以下方案:
方案1:通过Office COM接口优雅退出(自动化开发首选)
做Office自动化开发时,直接引用Word COM组件操作实例,完全模拟用户正常操作流程退出,不会被识别为异常退出:
using Microsoft.Office.Interop.Word; // 启动Word实例时保留Application对象引用 Application wordApp = new Application(); Document doc = wordApp.Documents.Open("你的文档路径"); // 完成文档修改、保存逻辑后执行以下操作 doc.Save(); doc.Close(); wordApp.Quit(); // 释放COM对象,避免残留后台进程 System.Runtime.InteropServices.Marshal.ReleaseComObject(doc); System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp); doc = null; wordApp = null; GC.Collect(); GC.WaitForPendingFinalizers();
方案2:针对无COM引用的运行中Word进程,发送关闭消息模拟点击叉号
如果无法拿到当前运行Word的COM对象引用,可以调用系统API给Word主窗口发送WM_CLOSE消息,效果和用户手动点关闭按钮完全一致:
using System.Diagnostics; using System.Runtime.InteropServices; // 导入系统消息发送API [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); private const uint WM_CLOSE = 0x0010; // 遍历所有Word进程执行关闭 foreach (Process process in Process.GetProcessesByName("WINWORD")) { if (!process.HasExited) { SendMessage(process.MainWindowHandle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); // 等待进程正常退出,超时再强制杀死 process.WaitForExit(3000); if (!process.HasExited) { process.Kill(); } } }
兜底方案:启动Word时加参数强制打开空白文档
如果不需要管控关闭逻辑,也可以在启动Word时添加/n启动参数,会强制跳过恢复逻辑,直接打开全新空白实例:
Process.Start(new ProcessStartInfo("WINWORD.EXE", "/n"));
内容的提问来源于stack exchange,提问作者DecodeD
相关产品推荐
相关产品推荐

