C# 退出我的应用程序的所有实例

C# 退出我的应用程序的所有实例,c#,winforms,C#,Winforms,我有以下功能: private void TakeOverAllScreens() { int i = 0; foreach (Screen s in Screen.AllScreens) { if (s != Screen.PrimaryScreen) { i++; Process.Start(Application.Execu

我有以下功能:

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);
            }
        }
    }
void ExitAll(string processName)
{
    foreach(Process p in Process.GetProcesses())
    {
        if (p.ProcessName.ToLower().Equals(processName.ToLower()))
            p.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));
            }
        }
    }

您可以终止具有相同名称的所有进程:

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

current.Kill();

将所有打开的进程放在列表中,以便可以逐个终止该进程。看下面的代码:

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();
    }
}
private void takeverallscreens()
{
int i=0;
列出所有进程=新建列表();
foreach(屏幕中的屏幕s。所有屏幕)
{
如果(s!=Screen.PrimaryScreen)
{
i++;
添加(Process.Start(Application.ExecutablePath,“Screen |”+s.Bounds.X+“|”+s.Bounds.Y+“|”+i));
}
}
foreach(所有进程中的进程进程)
{
proc.Kill();
}
}
尝试此功能:

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);
            }
        }
    }
void ExitAll(string processName)
{
    foreach(Process p in Process.GetProcesses())
    {
        if (p.ProcessName.ToLower().Equals(processName.ToLower()))
            p.Kill();
    }
}

我总是执行命令

tskill notepad // to kill all instances of notepad
从应用程序内部,它可以像

Process.Start("cmd /k tskill " + Process.GetCurrentProcess().ProcessName)
如何关闭应用程序? 一般有三种选择:

  • 彻底杀了它
  • 假设它有一个主窗口,并且它的行为是常规的,则通过P/Invoking向该窗口发送
    WM_CLOSE
    消息
  • 假设它想要合作,使用一个定制的通信通道告诉它终止自己
您应该如何关闭应用程序? 彻底杀死一个进程是一件很重的事情,除非你知道进程在终止时不会做任何敏感的事情,否则永远不要尝试。通常,这是作为最后手段使用的

告诉它关闭其主窗口要求您首先了解该窗口的
HWND
是什么;您可以通过遍历顶级窗口列表或让派生的进程以某种方式与您进行通信来实现这一点。它还假设当您请求关闭其主窗口时,另一个进程将决定终止自身(实际上,它可以决定执行任何操作,包括完全忽略消息)。这种方法是一种合理的第一次尝试,通常适用于不受您控制的进程——尽管您必须自己找到窗口

使用自定义通信通道允许您完全控制所发生的事情以及如何以多种方式实现它,但这种方法需要编写最多的代码,并且需要您对这两个应用程序都具有源代码访问权限

结论
视情况而定。如果您1000%确信终止进程不会破坏任何东西,那么这将是一个快速而肮脏的解决方案;否则,您需要使用两种“礼貌”方法中的一种。

Process类有一个
Id
您可能可以使用它来终止进程。这对应用程序的任何实例有效,还是仅对“Main”实例有效?让我问一下,新实例是否循环生成新实例?否,只有主实例创建新实例。是。它应该通过“主”进程终止所有启动的进程。对于主进程,您可以使用
Application.Exit()
终止它,因为该应用程序只读取和显示数据,所以很酷。此外,我是一个快速和肮脏的球迷!这是我使用的代码。工作起来很有魅力。但不是在调试中,因为
ProcessName
在调试中是不同的