Закройте все экземпляры приложения

У меня есть следующие функции:

private void TakeOverAllScreens()
    {
        int i = 0;
        foreach (Screen s in Screen.AllScreens)
        {

            if (s != Screen.PrimaryScreen)
            {
                i++;
               Process.Start(Application.ExecutablePath, "Screen|" + s.Bounds.X + "|" + s.Bounds.Y + "|" + i);
            }
        }
    }

Как вы можете видеть, он создает отдельный экземпляр приложения для каждого экрана на ПК.

Как я могу создать функцию exit, которая закроет все из них? Функция должна работать на любом экземпляре приложения, а не только на моем "основном" экземпляре.

6 ответов


вы можете завершить все процессы с одинаковым именем:

var current = Process.GetCurrentProcess();
Process.GetProcessesByName(current.ProcessName)
    .Where(t => t.Id != current.Id)
    .ToList()
    .ForEach(t => t.Kill());

current.Kill();

просто вы должны отслеживать открытые процессы:

List<Process> opened = new List<Process>();

private void TakeOverAllScreens()
    {
        int i = 0;
        foreach (Screen s in Screen.AllScreens)
        {

            if (s != Screen.PrimaryScreen)
            {
                i++;
               opened.Add(Process.Start(Application.ExecutablePath, "Screen|" + s.Bounds.X + "|" + s.Bounds.Y + "|" + i));
            }
        }
    }

затем:

private void terminateAll()
{
      foreach (var p in opened) p.Kill();
}

как вы можете закрыть приложение?

есть три общих варианта:

  • убить его наповал
  • предполагая, что у него есть главное окно и что он ведет себя традиционно, отправьте WM_CLOSE сообщение в это окно с помощью P / Invoking SendMessage
  • предполагая, что он хочет сотрудничать, используйте пользовательский канал связи, чтобы сказать ему прекратить себя

как вы должны закрыть заявление?

убийство процесса прямо является тяжелым и никогда не должно быть предпринято, если вы не знаете, что процесс не будет делать ничего чувствительного, когда он будет завершен. Обычно это используется в крайнем случае.

говоря ему закрыть свое главное окно, вы сначала узнаете, что это окно HWND как-то; вы можете сделать это, пройдя список окон верхнего уровня или имея порожденный процесс каким-то образом сообщить его вам. Он также предполагает, что другой процесс решит завершить себя, когда вы попросите, чтобы его главное окно было закрыто (на самом деле он может решить сделать что угодно, в том числе полностью игнорировать сообщение). Этот подход является разумной первой попыткой, и он обычно отлично работает с процессами, которые не находятся под вашим контролем, хотя вам нужно найти окно самостоятельно.

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

вывод

зависит. Если вы на 1000% уверены, что убийство процесса ничего не нарушит, это будет быстрое и грязное решение; в противном случае вам нужно использовать один из двух "вежливых" подходов.


поместите весь открытый процесс в список, чтобы вы могли убить процесс один за другим. Посмотрите код ниже:

private void TakeOverAllScreens()
{
    int i = 0;
    List<Process> allProcesses = new List<Process>();
    foreach (Screen s in Screen.AllScreens)
    {
        if (s != Screen.PrimaryScreen)
        {
            i++;
           allProcesses.Add(Process.Start(Application.ExecutablePath, "Screen|" + s.Bounds.X + "|" + s.Bounds.Y + "|" + i));
        }
    }

    foreach (Process proc in allProcesses)
    {
        proc.Kill();
    }
}

Я всегда выполняю команду

tskill notepad // to kill all instances of notepad

из приложения, это может быть сделано как

Process.Start("cmd /k tskill " + Process.GetCurrentProcess().ProcessName)

попробуйте эту функцию:

void ExitAll(string processName)
{
    foreach(Process p in Process.GetProcesses())
    {
        if (p.ProcessName.ToLower().Equals(processName.ToLower()))
            p.Kill();
    }
}