退出我的应用的所有实例

时间:2012-10-23 08:26:18

标签: c# winforms

我有以下功能:

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);
            }
        }
    }

正如您所看到的,它为PC上的每个屏幕创建了一个单独的应用程序实例。

如何创建一个关闭所有这些功能的退出功能? 该函数需要在应用程序的任何实例上工作,而不仅仅是我的“主”实例。

6 个答案:

答案 0 :(得分:9)

您可以使用相同名称终止所有进程:

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

current.Kill();

答案 1 :(得分:3)

您必须跟踪已打开的流程:

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();
}

答案 2 :(得分:3)

如何关闭申请?

有三种常规选择:

  • 直接杀死
  • 假设它有一个主窗口并且按照惯例运行,请通过P / Invoking SendMessage
  • 向该窗口发送WM_CLOSE消息
  • 假设它想要合作,请使用自定义通信渠道告诉它自行终止

您应该如何关闭申请?

彻底杀死一个进程是严厉的,除非你知道这个进程在终止时不会做任何敏感的事情,否则绝不应该尝试。通常情况下,这是最后的手段。

告诉它关闭它的主窗口需要你首先以某种方式了解那个窗口HWND;您可以通过遍历顶级窗口列表或通过生成的进程以某种方式将其传达给您来实现。它还假设当您要求关闭其主窗口时,其他进程将决定终止自身(实际上它可以决定做任何事情,包括完全忽略该消息)。这种方法是合理的第一次尝试,它通常适用于不受您控制的过程 - 尽管您必须自己找到窗口。

使用自定义通信渠道可以让您完全控制发生的事情以及如何以多种方式实施,但这是一种涉及编写大部分代码并需要您拥有源代码的方法应用

结论

取决于。如果你1000%确定杀死这个过程不会破坏任何东西,那么这将是一个快速而肮脏的解决方案;否则你需要使用其中一个&#34;礼貌&#34;方法

答案 3 :(得分:1)

将所有已打开的进程放入列表中,这样您就可以逐个终止进程。看下面的代码:

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();
    }
}

答案 4 :(得分:1)

尝试此功能:

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

答案 5 :(得分:1)

我总是执行命令

tskill notepad // to kill all instances of notepad

在App中,可以像

一样完成
Process.Start("cmd /k tskill " + Process.GetCurrentProcess().ProcessName)