关闭在代码中打开的进程

本文关键字:进程 代码 | 更新日期: 2023-09-27 18:30:46

>我创建了一个带有一些字段占位符的 WordTemplate,在代码中我在此占位符中插入值并将其显示给用户。

protected void Button1_Click(object sender, EventArgs e)
    {
        string DocFilePath = "";
        //string FilePath = System.Windows.Forms.Application.StartupPath;
        object fileName = @"[...]'asset'word templates'FormatPeygiri1.dot";
        DocFilePath = fileName.ToString();
        FileInfo fi = new FileInfo(DocFilePath);
        if (fi.Exists)
        {
            object readOnly = false;
            object isVisible = true;
            object PaperNO = "PaperNO";
            object PaperDate = "PaperDate";
            object Peyvast = "Peyvast";
            object To = "To";
            object ShoName = "ShoName";
            object DateName = "DateName";
            Microsoft.Office.Interop.Word.Document aDoc = 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 isVisible, ref missing, ref missing, ref missing);
            WordApp.ActiveDocument.FormFields.get_Item(ref PaperNO).Result = TextBox_PaperNO.Text;
            string strPaperDate = string.Format("{0}/{1}/{2}", PersianDateTimeHelper.GetPersainDay(DateTimePicker_PaperDate.SelectedDate),
                                               PersianDateTimeHelper.GetPersainMonth(DateTimePicker_PaperDate.SelectedDate),
                                               PersianDateTimeHelper.GetPersainYear(DateTimePicker_PaperDate.SelectedDate));
            WordApp.ActiveDocument.FormFields.get_Item(ref PaperDate).Result = strPaperDate;
            WordApp.ActiveDocument.FormFields.get_Item(ref Peyvast).Result = TextBox_Peyvast.Text;
            WordApp.ActiveDocument.FormFields.get_Item(ref To).Result = TextBox_To.Text; ;
            WordApp.ActiveDocument.FormFields.get_Item(ref ShoName).Result = TextBox_ShoName.Text;
            string strDateName = string.Format("{0}/{1}/{2}", PersianDateTimeHelper.GetPersainDay(DateTimePicker_DateName.SelectedDate),
                                               PersianDateTimeHelper.GetPersainMonth(DateTimePicker_DateName.SelectedDate),
                                               PersianDateTimeHelper.GetPersainYear(DateTimePicker_DateName.SelectedDate));
            WordApp.ActiveDocument.FormFields.get_Item(ref DateName).Result = strDateName;
            aDoc.Activate();
            WordApp.Visible = true;
            aDoc = null;
            WordApp = null;
        }
        else
        {
            MessageBox1.Show("File Not Exist!");
        }

它工作得很好,很成功!但是当用户关闭Word时,她的进程没有关闭,并且存在于任务管理器进程列表中。此进程名称为 WINWORD.exe我知道我可以关闭进程和代码[进程。Kill()]但我不知道我应该杀死哪个进程。如果我想杀死所有名称为[WINWORD.exe]的进程,则关闭所有Word窗口,但我想关闭特定的Word窗口并杀死我打开的进程。

怎么办?

关闭在代码中打开的进程

如果 Quit 方法无济于事,请检查一下(只需将 excel 对象替换为 winword 对象): http://blogs.msdn.com/b/msdnforum/archive/2010/03/09/excel-does-not-quit-after-automation-from-net-side.aspx

编辑:和硬核解决方案:

public static class WinWordKiller
{
        [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
    private static extern long GetWindowThreadProcessId(long hWnd, out long lpdwProcessId);
    public static void Kill(ref Microsoft.Office.Interop.Word.Application app)
    {
        long processId = 0;
        long appHwnd = (long)app.Hwnd;
        GetWindowThreadProcessId(appHwnd, out processId);
        Process prc = Process.GetProcessById((int)processId);
        prc.Kill();
    }
}

为什么不将Microsoft.Office.Interop.Word.Application.Quit与已打开的应用程序(WordApp)一起使用?

我应该注意,在这样做时,您当然应该保留您的 WordApp 引用,并且在您调用 T退出之前不要将其无效。