@bitande
PHP

Какой язык подойдет для запуска и закрытия exe приложений?

Привет.

Пытаюсь разработать одну программу.
Задача такая - нужно оконное приложение, в этом приложении я указываю путь к exe файлу, после чего нажимаю запустить и exe файл запускается, причем нужно передавать параметры.

Также нужна возможность закрывать запущенную программу. Не знаю может отслеживать процесс надо, но мне удобен вариант при котором я буду просто находить определенный порт и закрывать приложение которое его использует.

Я работал только в области веба, подскажите с чего начать? знаком с Java но не пойму можно ли реализовать на java то что мне нужно или нет.

С++ не желательно использовать, подойдет ли C#?
  • Вопрос задан
  • 499 просмотров
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Любой язык на это способен :-)

В C# работа с процессами может быть примерно такой:
// запускаем процесс
var process = System.Diagnostics.Process.Start(@"C:\windows\system32\calc.exe");
// убиваем процесс
process.Kill();
// или отправляем команду на закрытие главного окна
// process.CloseMainWindow();

// запуск можно выполнить через ProcessStartInfo,
// это может быть более удобней и больше возможностей
var processStartInfo = new System.Diagnostics.ProcessStartInfo();
// путь к файлу программы
processStartInfo.FileName = @"C:\windows\system32\notepad.exe";
// передаем аргументы (в данном случае путь файла для открытия)
processStartInfo.Arguments = @"C:\Windows\System32\drivers\etc\hosts";

// запускаем процесс
var process2 = System.Diagnostics.Process.Start(processStartInfo);

// если необходимо, можем получить список всех процессов
var processes = System.Diagnostics.Process.GetProcesses();

// для примера, выводим в консоль
foreach(var p in processes)
{
  Console.WriteLine("PID#{0}, {1}", p.Id, p.ProcessName);
  // можем поубивать все блокноты
  // if (p.ProcessName == "notepad")
  // {
  //   p.Kill();
  // }
}

При запуске процессов, вы можете просто запомнить их идентификаторы (например в коллекцию, типа List<int> или же использовать свой тип, и/или запоминать экземпляры Process) и в последующем завершить работу этих процессов.

Информацию о запущенных процессах можно получать с помощью методов: System.Diagnostics.Process.GetProcessById() - по идентификатору процесса, System.Diagnostics.Process.GetProcessByName() - по имени процесса.

Если необходимо, к каждому создаваемому процессу можно подключить обработчик завершения работы процесса:
// создаем параметры запуска процесса
var processStartInfo = new System.Diagnostics.ProcessStartInfo();
processStartInfo.FileName = @"C:\windows\system32\notepad.exe";
processStartInfo.Arguments = @"C:\Windows\System32\drivers\etc\hosts";
      
// создаем экземпляр процесса
var process = new System.Diagnostics.Process();
// передаем параметры
process.StartInfo = processStartInfo;
// разрешаем использование обработчиков событий
process.EnableRaisingEvents = true; // <-- требуется для работы обработчика завершения процесса

// цепляем обработчик завершения работы процесса 
// (лучше сделать нормальную функцию, а не анонимную, как показано в примере)
process.Exited += (object sender, EventArgs e) =>
{
  // этот блок будет выполнен, когда работа процесса будет завершена
  // экземпляр процесса можно найти в sender: строгий тип - ((System.Diagnostics.Process)sender)
  // (хотя в данном примере без проблем можно использовать process, это будет даже удобней)

  // для примера, выводим в консоль идентификатор завершенного процесса
  Console.WriteLine("PID#{0} завершил работу", ((System.Diagnostics.Process)sender).Id);
};

// запускаем процесс
process.Start();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы