Закрытие процесса, который открывается в коде

Я создаю 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. Я знаю, что могу закрыть код процесса [ process.Kill () ], но я не знаю, какой процесс мне нужно убить. если я хочу уничтожить весь процесс с именем [WINWORD.exe], все окна Word закрыты. Но я хочу закрыть определенное окно Word и уничтожить процесс, который я открыл.

Как это сделать?

2 ответа

Если метод 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 и не аннулировать ее до тех пор, пока не вызовете Quit.

Другие вопросы по тегам