【问题标题】:How to kill all processes except the specific ones using c#如何使用c#杀死除特定进程之外的所有进程
【发布时间】:2020-08-17 17:36:02
【问题描述】:

我想杀死多个进程,但也想保留一些特定的进程。 实际上,我有两个列表框,其中一个包含我要杀死的进程列表。另一个有我想要保留的列表。

例如,我想关闭谷歌浏览器并保持计算器开启。 但是这段代码的问题是,它关闭了所有进程,甚至是 winform 本身。

private void BtnStop_Click(object sender, EventArgs e)
{
 Process[] processes = Process.GetProcesses();
  foreach (Process p in processes)
   {
    if (!String.IsNullOrEmpty(p.MainWindowTitle))
    {
//ChBlockApp is the name of the list box that i want to kill
      ChBlockApp.Items.Add(p.MainWindowTitle);
                  
      try 
          {
    // ListAllowed is the name of listbox which i want to keep
 if (p.MainWindowTitle != "Avid-Main Page" | p.MainWindowTitle != ListAllowed.items.toString())
     {
    
      p.Kill();
      }
}
catch (Exception KillExc)
                            
 {
MessageBox.Show("Unable to Close the Applicaiton: " + KillExc, "Warning", MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
}
}

我已尝试在此语句中使用检查来保持 Visual Studio 处于打开状态。

if (p.MainWindowTitle != "Avid-Main Page")
                            {}

但它也不起作用。

This Link 有一些提示,但我要保留多个程序。

【问题讨论】:

  • 这条线是怎么回事...p.MainWindowTitle != ListAllowed.items.toString()?这是检查标题是否等于Items 对象名称,即System.Windows.Forms.ListBox+ObjectCollection。这些永远不会匹配。另外,这些属性大写会导致编译失败,items.toString()
  • 我尝试搜索这些项目,但这也不起作用/

标签: c# winforms process kill


【解决方案1】:

你的逻辑在这一行是错误的:

if (p.MainWindowTitle != "Avid-Main Page" |
    p.MainWindowTitle != ListAllowed.items.toString())

应该是:

if (p.MainWindowTitle != "Avid-Main Page" &&
    !ListAllowed.Items.OfType<string>().Any(x => x == p.MainWindowTitle))

您必须遍历列表中的项目。 Linq 通过实现Any 让我们轻松做到这一点。它将遍历您的项目并检查是否有任何满足谓词。

此外,如果您使用| 而不是||,则您使用的是按位或。你可能不想这样做。通常在这些情况下,如果第一个是假的,您不需要验证另一个案例,它应该会在那个时候失败。

在这种特定情况下,我将其更改为&amp;&amp;,因为这样更容易理解:

“如果标题不等于“Avid-Main Page”并且标题不在我们的列表中,则终止该程序”

【讨论】:

    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多