C#

УЧЕБНЫЕ МАТЕРИАЛЫ ПО ПРОГРАММИРОВАНИЮ, КРЕКИНГУ, HTML, CSS, ОФИСНЫМ ПРИЛОЖЕНИЯМ

[Главная страница] [Контакты]

Программирование для Windows


Завершение другого процесса

ЗАДАЧА
Завершить выполняющийся в данный момент процесс.

РЕШЕНИЕ
Найдите процесс с помощью метода Process.GetProcessesByName и завершите его, вызвав метод Process.CloseMainWindow или Process.Kill.

ОБСУЖДЕНИЕ
Класс Process предоставляет для завершения процесса два метода: CloseMainWindow и Kill. CloseMainWindow посылает главному окну приложения сообщение «close», что эквивалентно закрытию окна пользователем. Первый метод предпочтительнее второго, так как позволяет выполнить нормальное завершение программы. Например, Microsoft Word в этом случае предложит пользователю сохранить все открытые документы. Однако CloseMainWindow может не завершить приложение, потому что большинство приложений будут запрашивать у пользователя подтверждение завершения.

В свою очередь Kill завершает процесс немедленно, что может привести к потере данных. Это эквивалентно завершению процесса при помощи Windows Task Manager (диспетчер задач Windows), и это годится только в крайнем случае. Например, при завершении работы ОС Windows пытается закрыть все открытые приложения, и, если после непродолжительного времени (около 30 секунд) процесс еще работает, она "убивает" его. Кроме того, метод Kill — единственный способ завершения процесса, не имеющего визуального интерфейса.

До вызова CloseMainWindow или Kill вы должны найти нужный Process. Если вы знаете дружественное имя процесса (обычно это имя исполняемого файла без расширения .ехе), вы можете вызвать GetProcessesByName. Вы также можете получить все процессы при помощи метода GetProcesses и изучить для нахождения корректного экземпляра другие свойства объектов Process.

Следующее простое консольное приложение пытается закрыть Microsoft Excel. Если через 10 секунд после вызова CloseMainWindow Excel все еще работает, для его завершения вызывается метод Kill:

using System;
using System.Diagnostics; // !!!

namespace ProcessKillTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] Processes = Process.GetProcessesByName("excel");
            foreach (Process Proc in Processes)
            {
                // Попытка закрытия окна. Если имеются несохраненные документы
                // Excel, появится окно, предлагающее сохранить изменения.
                Proc.CloseMainWindow();

                // Ожидание до 30 секунд.
                Proc.WaitForExit(10000);

                // Если процесс еще работает, он "убивается".
                if (!Proc.HasExited)
                {
                    Proc.Kill();
                    Console.WriteLine("Приложение было принудительно закрыто.");
                }
                else
                {
                    Console.WriteLine("Приложение было закрыто правильно.");
                }
            }
        }
    }
}

Методы CloseMainWindow и Kill не позволяют завершать процессы на удаленных компьютерах.

 

Используемая литература:

  1. Занимательное программирование на Bisual Basic.NET: Климов А.П.
  2. Программирование для Microsoft Windows на C#: Чарльз Петцольд.
  3. РеРецепты программирования на Visual Basic.NET: Мэтью Макдональд.