9

我有以下功能:

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 上的每个屏幕创建了我的应用程序的单独实例。

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

4

6 回答 6

11

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

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

current.Kill();
于 2012-10-23T08:33:27.347 回答
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();
}
于 2012-10-23T08:28:34.547 回答
3

如何关闭应用程序?

有三个通用选项:

  • 直接杀了
  • 假设它有一个主窗口并且它的行为是常规的,WM_CLOSE通过 P/Invoking 向该窗口发送一条消息SendMessage
  • 假设它想合作,使用自定义通信通道告诉它终止自己

您应该如何关闭应用程序?

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

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

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

结论

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

于 2012-10-23T08:40:15.907 回答
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();
    }
}
于 2012-10-23T08:33:38.477 回答
1

试试这个功能:

void ExitAll(string processName)
{
    foreach(Process p in Process.GetProcesses())
    {
        if (p.ProcessName.ToLower().Equals(processName.ToLower()))
            p.Kill();
    }
}
于 2012-10-23T08:35:10.577 回答
1

我总是执行命令

tskill notepad // to kill all instances of notepad

从应用程序内部,它可以像

Process.Start("cmd /k tskill " + Process.GetCurrentProcess().ProcessName)
于 2012-10-23T08:36:14.723 回答